Skip to content

Instantly share code, notes, and snippets.

@codeprogression
Created July 29, 2011 14:35
Show Gist options
  • Save codeprogression/1113933 to your computer and use it in GitHub Desktop.
Save codeprogression/1113933 to your computer and use it in GitHub Desktop.
SO6870467
using System;
using System.Collections.Generic;
using System.Data;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Mapping;
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace SO6870467
{
public class VehicleCollector
{
public VehicleCollector()
{
Cars = new List<Car>();
Trains = new List<Train>();
}
public virtual int Id { get; set; }
public virtual IList<Car> Cars { get; set; }
public virtual IList<Train> Trains { get; set; }
}
public class Vehicle {
public virtual int Id { get; set; }
}
public class Car : Vehicle { }
public class Train : Vehicle { }
public class FooMap : ClassMap<VehicleCollector>
{
public FooMap()
{
Id(x => x.Id).GeneratedBy.Identity();
this.HasMany(x => x.Cars).KeyColumn("foo_id");
this.HasMany(x => x.Trains).KeyColumn("foo_id");
}
}
public class VehicleMap : ClassMap<Vehicle>
{
public VehicleMap()
{
Id(x => x.Id).GeneratedBy.Identity();
this.DiscriminateSubClassesOnColumn("type");
}
}
public class CarMap : SubclassMap<Car>
{
public CarMap() { this.DiscriminatorValue(1); }
}
public class TrainMap : SubclassMap<Train>
{
public TrainMap() { this.DiscriminatorValue(2); }
}
public class NHibernateConfig
{
public void TestMapping()
{
ISessionFactory sessionFactory = CreateSessionFactory();
ISession session = sessionFactory.OpenSession();
session.FlushMode = FlushMode.Commit;
session.BeginTransaction();
var collector = new VehicleCollector();
for (int i = 0; i < 10; i++)
{
var car = new Car();
var train = new Train();
session.Save(car);
session.Save(train);
collector.Cars.Add(car);
collector.Trains.Add(train);
}
session.Save(collector);
session.Transaction.Commit();
session.BeginTransaction();
var dbCollector = session.Get<VehicleCollector>(collector.Id);
System.Diagnostics.Debug.Assert(dbCollector.Cars.Count == 10);
System.Diagnostics.Debug.Assert(dbCollector.Trains.Count == 10);
session.Transaction.Commit();
}
public ISessionFactory CreateSessionFactory()
{
NHibernateProfiler.Initialize();
return CreateSessionFactory(GetSqlConfiguration(), BuildSchema);
}
protected virtual Func<IPersistenceConfigurer> GetSqlConfiguration()
{
MsSqlConfiguration msSql2005 = MsSqlConfiguration.MsSql2008;
Action<MsSqlConnectionStringBuilder> expression =
c => c.Server("(local)").Database("StackOverflow").TrustedConnection();
return () => msSql2005.ConnectionString(expression)
.UseReflectionOptimizer()
.IsolationLevel(IsolationLevel.ReadUncommitted)
.ShowSql();
}
public virtual ISessionFactory CreateSessionFactory(Func<IPersistenceConfigurer> configuration,
Action<Configuration> schema)
{
try
{
FluentConfiguration configure = Fluently.Configure();
FluentConfiguration database = configure.Database(configuration);
FluentConfiguration mappings = database.Mappings(CreateMappings());
FluentConfiguration fluentConfiguration = mappings.ExposeConfiguration(schema);
return fluentConfiguration.BuildSessionFactory();
}
catch (Exception ex)
{
throw;
}
}
private Action<MappingConfiguration> CreateMappings()
{
return m => m.FluentMappings.AddFromAssemblyOf<NHibernateConfig>();
}
protected virtual void BuildSchema(Configuration config)
{
new SchemaExport(config).Create(true, true);
}
}
}
if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FK7867CB2431A8C8E6]') AND parent_object_id = OBJECT_ID('[Vehicle]'))
alter table [Vehicle] drop constraint FK7867CB2431A8C8E6
if exists (select * from dbo.sysobjects where id = object_id(N'[VehicleCollector]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [VehicleCollector]
if exists (select * from dbo.sysobjects where id = object_id(N'[Vehicle]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [Vehicle]
create table [VehicleCollector] (
Id INT IDENTITY NOT NULL,
primary key (Id)
)
create table [Vehicle] (
Id INT IDENTITY NOT NULL,
type NVARCHAR(255) not null,
foo_id INT null,
primary key (Id)
)
alter table [Vehicle]
add constraint FK7867CB2431A8C8E6
foreign key (foo_id)
references [VehicleCollector]
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('1'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [Vehicle] (type) VALUES ('2'); select SCOPE_IDENTITY()
NHibernate: INSERT INTO [VehicleCollector] DEFAULT VALUES; select SCOPE_IDENTITY()
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 3 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 5 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 7 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 9 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 11 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 13 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 15 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 17 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 19 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 2 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 4 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 6 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 8 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 12 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 14 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 16 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 18 [Type: Int32 (0)]
NHibernate: UPDATE [Vehicle] SET foo_id = @p0 WHERE Id = @p1;@p0 = 1 [Type: Int32 (0)], @p1 = 20 [Type: Int32 (0)]
1 passed, 0 failed, 0 skipped, took 1.67 seconds (Ad hoc).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment