For the last question, the reason I use "Set" is that "List" in NH mapping has an "index". I tried to use the Property.SortOrder as the index but met a lot of problems. So I try to use a "sorted set" (as the doc mentioned) as a workaround.
Thanks for your reply, I'll have a try later. I used Linq to SQL before and now I'm going to use NH but it seems much more complicated than L2S. Blog: http://www.cnblogs.com/JeffreyZhao/ Twitter: http://twitter.com/jeffz_cn -------------------------------------------------- From: "Stefan Steinegger" <[email protected]> Sent: Friday, August 14, 2009 7:55 PM To: "nhusers" <[email protected]> Subject: [nhusers] Re: How can I JUST delete an entity using NHibernate > > You mapped the ProductID in the Property: > > <class name="Property"> > ... > <property name="Name"/> > <property name="SortOrder"/> > <property name="ProductID" /> <<== evil > </class> > > This probably resets the product id with the property value, which is > not initialized. > > Consider to have a full reference to product (don't forget to make the > set inverse="true") or just leave it away. > > You are working with an ORM. This means: you don't have any relational > stuff in your class model. So you shouldn't have "foreign keys" there. > > BTW, you probably should map it like this: > > <set name="Properties" cascade="all" table="Product_Details"> > <key column="ProductID" on-delete="cascade"/> > <composite-element type="Property"> > <property name="Name"/> > <property name="..."/> > </composite-element> > </set> > > This makes it a list of value-type-alike instances. Property will not > have an id anymore. > See http://nhforge.org/doc/nh/en/index.html#components > > And - why is it a set if you need a sort order? It should probably be > a list. > > > On 14 Aug., 12:38, "Jeffrey Zhao" <[email protected]> wrote: >> Thanks, I tried. As the post said, I changed the mapping sittings like: >> >> <set name="Properties" cascade="all(or save-update)" lazy="true" >> inverse="true"> >> <key column="ProductID" on-delete="cascade" /> >> <one-to-many class="Property"/> >> </set> >> >> And now NH just execute an DELETE sql as I want. But, I cannot correctly >> insert the data now: >> >> var product = new Product { Name = "Product" }; >> product.Properties.Add(new Property { Name = "P0", SortOrder = 0 }); >> product.Properties.Add(new Property { Name = "P1", SortOrder = 1 }); >> session.Save(product); >> session.Flush(); >> >> But now the data in database is: >> >> table Product >> ProductID Name >> ----------- -------------------------------------------------- >> 9 Product >> >> table Property >> PropertyID ProductID Name >> SortOrder >> ----------- ----------- -------------------------------------------------- >> ----------- >> 12 0 P0 >> 0 >> 13 0 P1 >> 1 >> >> The ProductID column in Property should be 9 but 0. >> >> // PS: I cannot find the discription of on-delete attribute in the >> doc:http://nhforge.org/doc/nh/en/index.html. >> >> Blog:http://www.cnblogs.com/JeffreyZhao/ >> Twitter:http://twitter.com/jeffz_cn >> >> -------------------------------------------------- >> From: "Stefan Steinegger" <[email protected]> >> Sent: Friday, August 14, 2009 5:59 PM >> To: "nhusers" <[email protected]> >> Subject: [nhusers] Re: How can I JUST delete an entity using NHibernate >> >> >> >> > Try >> >> > Product product = session.Load<Product>(1); >> > session.Delete(product); >> >> > This should actually only create a proxy for the Product 8assuming you >> > are using lazy loading). Then you can remove it. >> >> > then you can use on-delete in the mapping to let the database clean up >> > referenced records: >> >http://vanryswyckjan.blogspot.com/2008/04/nhibernate-20-and-cascading... >> >> > On 14 Aug., 11:12, "Jeffrey Zhao" <[email protected]> wrote: >> >> Hello, >> >> >> I'm a new for NH and I met the problem of "how can I delete an >> >> entity". >> >> For example, I've got two entity with an one-to-many association. >> >> Here's the sql to build the table (omit the association): >> >> >> CREATE TABLE [dbo].[Property]( >> >> [PropertyID] [int] IDENTITY(1,1) NOT NULL, >> >> [ProductID] [int] NOT NULL, >> >> [Name] [nvarchar](50) NOT NULL, >> >> [SortOrder] [int] NOT NULL, >> >> CONSTRAINT [PK_Property] PRIMARY KEY CLUSTERED >> >> ( >> >> [PropertyID] ASC >> >> )) >> >> GO >> >> >> CREATE TABLE [dbo].[Product]( >> >> [ProductID] [int] IDENTITY(1,1) NOT NULL, >> >> [Name] [nvarchar](50) NOT NULL, >> >> CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED >> >> ( >> >> [ProductID] ASC >> >> )) >> >> GO >> >> >> Here comes the entities: >> >> >> public class Product >> >> { >> >> public virtual int ProductID { get; set; } >> >> public virtual string Name { get; set; } >> >> public virtual ISet<Property> Properties { get; set; }} >> >> >> public class Property >> >> { >> >> public virtual int PropertyID { get; set; } >> >> public virtual int ProductID { get; set; } >> >> public virtual string Name { get; set; } >> >> public virtual int SortOrder { get; set; } >> >> >> } >> >> >> and my hbm.xml file: >> >> >> <?xml version="1.0" encoding="utf-8" ?> >> >> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >> >> assembly="NHTest" >> >> namespace="NHTest"> >> >> <class name="Product" table="Product"> >> >> <id name="ProductID" column="ProductID"> >> >> <generator class="identity"/> >> >> </id> >> >> <property name="Name"/> >> >> <set name="Properties" cascade="all"> >> >> <key column="ProductID"/> >> >> <one-to-many class="Property"/> >> >> </set> >> >> </class> >> >> <class name="Property"> >> >> <id name="PropertyID"> >> >> <generator class="identity"/> >> >> </id> >> >> <property name="Name"/> >> >> <property name="SortOrder"/> >> >> <property name="ProductID" /> >> >> </class> >> >> </hibernate-mapping> >> >> >> well, that's quite simple, and I can insert one Product with two >> >> Properties without problem, but how can I delete the Product with ID >> >> equals 1? I tried: >> >> >> session.Delete(new Product { ProductID = 1 }); >> >> session.Flush(); >> >> >> But NH always want to update the properties' ProductID to NULL, but my >> >> schema won't accept the change (for NOT NULL). I tried every cascade >> >> settings in the <set /> element but always faild by updating. >> >> I just want to execute the SQL like "DELETE FROM Product WHERE >> >> ProductID >> >> = 1" and everything else could be done in database. (e.g., cascade >> >> deletion). >> >> What should I do? >> >> >> Blog:http://www.cnblogs.com/JeffreyZhao/ >> >> Twitter:http://twitter.com/jeffz_cn > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
