Thanks for your reply, but it seems that I have to map Property as entitis
since I need to get a single Property, modify and submit the changes of it.
I tried the mapping:
<class name="Product" table="Product">
<id name="ProductID" column="ProductID">
<generator class="identity"/>
</id>
<property name="Name"/>
<list name="Properties" cascade="all" lazy="true" inverse="true">
<key column="ProductID" />
<index column="SortOrder" />
<one-to-many class="Property"/>
</list>
</class>
<class name="Property">
<id name="PropertyID">
<generator class="identity"/>
</id>
<property name="Name"/>
</class>
but it seems that NH won't only provide a single Name column when insert a
Property instance - I have to map SortOrder as a property.
I'm trying to build a bi-directional association between Product and
Property. Thanks for your help.
Blog: http://www.cnblogs.com/JeffreyZhao/
Twitter: http://twitter.com/jeffz_cn
--------------------------------------------------
From: "Stefan Steinegger" <[email protected]>
Sent: Friday, August 14, 2009 9:06 PM
To: "nhusers" <[email protected]>
Subject: [nhusers] Re: How can I JUST delete an entity using NHibernate
>
> The index of a list is no property. It is just a column to allow NH to
> read it in the same order back as it has been stored.
>
> Not every column is a property. Foreign keys aren't, list indexes are
> also no properties.
>
> With a list of composite-elements your Property would only look like
> this:
>
> public class Property
> {
> public virtual string Name { get; set; }
> }
>
> And the table would have this columns:
>
> ProductId (foreign key to product)
> SortOrder
> Name
>
>
> On 14 Aug., 14:44, "Jeffrey Zhao" <[email protected]> wrote:
>> 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.
>> > Seehttp://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
-~----------~----~----~----~------~----~------~--~---