I solved the problem at http://stackoverflow.com/questions/5461485/nhibernate-entity-with-composite-id-saving-issue/5466399
On Mar 29, 9:51 am, Hardy <[email protected]> wrote: > I alomost followed step by step of this post to create my sample, the > problem is that NH justdoes not genrate insert statement against my > OrderDetail table. > > On Mar 28, 6:34 pm, John Davidson <[email protected]> wrote: > > > > > 2 posts that will probably help you > > >http://nhforge.org/blogs/nhibernate/archive/2010/06/30/nhibernate-and... > > >http://nhforge.org/blogs/nhibernate/archive/2011/01/08/composite-with... > > > John Davidson > > > On Mon, Mar 28, 2011 at 11:46 AM, Hardy <[email protected]> wrote: > > > Hi all, > > > > In order to make myself clear, I have created a most basic case to > > > describe my problem. Let's say I have 3 tables: > > > > CREATE TABLE [dbo].[Product]( > > > [ProductID] [int] IDENTITY(1,1) NOT NULL, > > > [ProductName] [varchar](50) NOT NULL, > > > CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED ( [ProductID] ASC ) > > > ) ON [PRIMARY] > > > > CREATE TABLE [dbo].[OrderHeader]( > > > [HeaderID] [int] IDENTITY(1,1) NOT NULL, > > > [Comment] [varchar](100) NULL, > > > CONSTRAINT [PK_OrderHeader] PRIMARY KEY CLUSTERED ( [HeaderID] > > > ASC ) > > > ) ON [PRIMARY] > > > > CREATE TABLE [dbo].[OrderDetail]( > > > [HeaderID] [int] NOT NULL, /* FK to OrderHeader table */ > > > [ProductID] [int] NOT NULL, /* FK to Product table */ > > > [CreatedOn] [datetime] NOT NULL, > > > CONSTRAINT [PK_OrderDetail] PRIMARY KEY CLUSTERED > > > ( > > > [HeaderID] ASC, > > > [ProductID] ASC > > > ) > > > ) ON [PRIMARY] > > > > And I have created correponding entity classes and mapping classes. > > > > public class Product { > > > public virtual int? Id { get; set; } > > > > public virtual string Name { get; set; } > > > } > > > > public class ProductMap : ClassMap<Product> { > > > public ProductMap() { > > > Table("Product"); > > > > Id(x => x.Id, "ProductID").GeneratedBy.Identity(); > > > Map(x => x.Name, "ProductName"); > > > } > > > } > > > > public class OrderHeader { > > > public virtual int? Id { get; set; } > > > > public virtual string Comment { get; set; } > > > > public virtual IList<OrderDetail> Details { get; set; } > > > } > > > > public class OrderHeaderMap : ClassMap<OrderHeader> { > > > public OrderHeaderMap() { > > > Table("OrderHeader"); > > > > Id(x => x.Id, "HeaderID").GeneratedBy.Identity(); > > > Map(x => x.Comment, "Comment"); > > > > HasMany<OrderDetail>(x => > > > x.Details).KeyColumn("HeaderID").Inverse(); > > > } > > > } > > > > public class OrderDetail { > > > public virtual int? OrderHeaderId { get; set; } > > > > public virtual int? ProductId { get; set; } > > > > public virtual OrderHeader OrderHeader { get; set; } > > > > public virtual Product Product { get; set; } > > > > public virtual DateTime? CreatedOn { get; set; } > > > > public override bool Equals(object obj) { > > > OrderDetail other = obj as OrderDetail; > > > if (other == null) { > > > return false; > > > } else { > > > return this.ProductId == other.ProductId && > > > this.OrderHeaderId == > > > other.OrderHeaderId; > > > } > > > } > > > > public override int GetHashCode() { > > > return (OrderHeaderId.ToString() + "|" + > > > ProductId.ToString()).GetHashCode(); > > > } > > > } > > > > public class OrderDetailMap : ClassMap<OrderDetail> { > > > public OrderDetailMap() { > > > Table("OrderDetail"); > > > > CompositeId().KeyProperty(x => x.ProductId, > > > "ProductID").KeyProperty(x => x.OrderHeaderId, "HeaderID"); > > > > References<OrderHeader>(x => x.OrderHeader, > > > "HeaderID").Not.Nullable(); > > > References<Product>(x => x.Product, > > > "ProductID").Not.Nullable(); > > > > Version(x => > > > x.CreatedOn).Column("CreatedOn").Generated.Always(); > > > } > > > } > > > > I have also created NH Session Provider > > > > public class NHibernateSessionProvider { > > > private static ISessionFactory sessionFactory; > > > > public static ISessionFactory SessionFactory { > > > get { > > > if (sessionFactory == null) { > > > sessionFactory = > > > createSessionFactory(); > > > } > > > return sessionFactory; > > > } > > > } > > > > private static ISessionFactory createSessionFactory() { > > > return Fluently.Configure() > > > > .Database(MsSqlConfiguration.MsSql2008.ShowSql() > > > .ConnectionString(c => > > > c.FromConnectionStringWithKey("TestDB"))) > > > .Mappings(m => > > > m.FluentMappings.AddFromAssemblyOf<OrderHeaderMap>()) > > > .BuildSessionFactory(); > > > } > > > } > > > > And a NH repository class is also created > > > > public class NHibernateRepository<T, TId> { > > > protected ISession session = null; > > > protected ITransaction transaction = null; > > > > public NHibernateRepository() { > > > this.session = > > > NHibernateSessionProvider.SessionFactory.OpenSession(); > > > } > > > > public void Save(T entity) { > > > session.SaveOrUpdate(entity); > > > } > > > > public void AddNew(T entity) { > > > session.Save(entity); > > > } > > > > public void BeginTransaction() { > > > transaction = session.BeginTransaction(); > > > } > > > > public void CommitTransaction() { > > > transaction.Commit(); > > > closeTransaction(); > > > } > > > > public void RollbackTransaction() { > > > transaction.Rollback(); > > > closeTransaction(); > > > closeSession(); > > > } > > > > private void closeTransaction() { > > > transaction.Dispose(); > > > transaction = null; > > > } > > > > private void closeSession() { > > > session.Close(); > > > session.Dispose(); > > > session = null; > > > } > > > > public void Dispose() { > > > if (transaction != null) { > > > CommitTransaction(); > > > } > > > > if (session != null) { > > > session.Flush(); > > > closeSession(); > > > } > > > } > > > } > > > > In my code, I have created 2 different ways to save this master/detail > > > structure with composite-id. > > > > private static void method1() { > > > NHibernateRepository<OrderHeader, int?> repo = new > > > NHibernateRepository<OrderHeader, int?>(); > > > OrderHeader oh = new OrderHeader(); > > > oh.Comment = "Test Comment " + > > > DateTime.Now.ToString(); > > > oh.Details = new List<OrderDetail>(); > > > for (int i = 0; i < 2; i++) { > > > OrderDetail od = new OrderDetail > > > { > > > OrderHeader = oh, > > > Product = new Product > > > { > > > Id = i + 3 > > > } > > > };- Hide quoted text - > > - Show quoted text -... > > read more » -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
