Created
July 29, 2011 14:35
-
-
Save codeprogression/1113933 to your computer and use it in GitHub Desktop.
SO6870467
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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