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.

Reply via email to