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
> >                                        }
> >                                };
>
> >                                oh.Details.Add(od);
> >                        }
>
> >                        repo.Save(oh);
> >                }
>
> >                private static void method2() {
> >                        NHibernateRepository<OrderHeader, int?> repoHeader =
> > new
> > NHibernateRepository<OrderHeader, int?>();
> >                        OrderHeader oh = new OrderHeader();
> >                        oh.Comment = "Test Comment " +
> > DateTime.Now.ToString();
> >                        repoHeader.Save(oh);
>
> >                        NHibernateRepository<OrderDetail, int?> repoDetail =
> > new
> > NHibernateRepository<OrderDetail, int?>();
> >                        for (int i = 0; i < 2; i++) {
> >                                OrderDetail od = new OrderDetail
> >                                {
> >                                        OrderHeaderId = oh.Id,
> >                                        OrderHeader = oh,
> >                                        ProductId = i + 3,
> >                                        Product = new Product
> >                                        {
> >                                                Id = i + 3
> >                                        },
> >                                };
>
> >                                repoDetail.AddNew(od);
> >                        }
> >                }
>
> > But for both methods, the OrderDetail table is never saved. I have
> > turned on ShowSql() to see SQL statement executed on console, no SQL
> > generated to save OrderDetail table at all.
>
> > I did quite a lot of search everywhere and could not have a clear
> > conclusion what is wrong.
>
> > Anybody has some clue, what exactly do I need to do to save an entity
> > with composite-id?
>
> > Thanks
>
> > Hardy
>
> > --
> > 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.- Hide quoted text -
>
> - Show quoted text -

-- 
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.

Reply via email to