Nhibernate 从<;地图>;
我有地图:Nhibernate 从<;地图>;,nhibernate,map,Nhibernate,Map,我有地图: <class name="User" table="Users" lazy="false"> <id name="id" type="Int32" column="id"> <generator class="identity" /> </id> <property name="name" column="name" type="String"/> <map name="Urls" table=
<class name="User" table="Users" lazy="false">
<id name="id" type="Int32" column="id">
<generator class="identity" />
</id>
<property name="name" column="name" type="String"/>
<map name="Urls" table="UserUrl" lazy="true" inverse="true" cascade="all">
<key column="user_id"></key>
<index column="url_type_id" type="Int32"/>
<one-to-many class="UserUrl"/>
</map>
</class>
<class name="UserUrl" table="UserUrl" lazy="false">
<id name="id" type="Int32" column="id">
<generator class="identity"/>
</id>
<property name="user_id" column="user_id" type="Int32" not-null="true"/>
<property name="UrlType" column="url_type_id" type="Int32" not-null="true"/>
<property name="Url" column="url" type="String" not-null="true"/>
</class>
我也有
class User
{
IDictionary<int,UserUrl> Urls;
....
}
User currentUser = FindById(2);
currentUser.Urls.Remove(5);
类用户
{
索引URL;
....
}
用户currentUser=FindById(2);
currentUser.url.Remove(5);
所以我从Url的关联集合中删除了一项。然后我调用SaveOrUpdateCopy(…)
,但表UserUrl
中的url不会删除,并且没有错误
有人知道如何从集合和数据库中删除子项吗?将元素的“反向”设置为false。尝试以下操作:
<map name="Urls" lazy="true" cascade="all-delete-orphans">
您正在映射那里的外键!我从来不敢这样做
实际上,我不确定你是否应该像这样绘制地图:
<map name="Urls" table="UserUrl" lazy="true" cascade="all-delete-orphans">
<key column="user_id"/>
<index column="url_type_id" type="Int32"/>
<composite-element>
<property name="UrlType" column="url_type_id" type="Int32" not-null="true"/>
<property name="Url" column="url" type="String" not-null="true"/>
</composite-element>
</map>
如果Url不是具有自己Id的独立实体,那么可以将其映射为复合元素。url被视为值类型。不再有类UserUrl
映射
编辑:
- 请参见,它解释了组件
- 如果在引用中遇到NOTNULL问题,只需删除NOTNULL
外键上的约束。NH需要插入一些列以获取
如果使用
,则主键会存储 一个空的临时文件generator class=“identity”
和
之间区别的信息,所以我使用
如果Url不是具有自己Id的独立实体,则可以将其映射为复合元素。url被视为值类型。
不再有类UserUrl映射。 我在其他代码中使用UserUrl类 -顺便说一句,如果你真的在评论一个问题,不要回答你的问题 回答。你可能会被否决 -问题是我并没有stackoverflow帐户,所以用相同的名字登录网站的唯一方法就是在我的帖子下面输入姓名和电子邮件。我尝试使用相同的名称和电子邮件在该网站上注册帐户,但当我登录时,它会将我视为新用户(而不是我第一次登录)。
所以我别无选择 我还发现工作代码是
<map name="Urls" lazy="true" cascade="all-delete-orphans" inverse="true">
如果不使用reverse=“true”,则无法运行。我尝试了它,但出现了错误“无法将值NULL插入到表“dbo.UserUrl”的“user_id”列中;列不允许为NULL。更新失败。语句已终止。”非常感谢您的回答。我使用:插入新的UserUrl。我试图将其从映射和类中删除,并得到错误“无法将值NULL插入列‘user_id’表‘dbo.UserUrl’”,因此您不了解组件。看到我的答案,我添加了一个链接。顺便说一句,如果你真的对答案发表评论,不要回答你的问题。你可能会被否决。忘了告诉你这个秘密:你可以一起选择几行,让代码显示为源代码(这只是在每行前面加4个空格)。它也会在每一行中断,并有一些漂亮的语法突出显示。不要使用,
,aso。只需选择文本并使用编辑器顶部的按钮。
<map name="Urls" lazy="true" cascade="all-delete-orphans" inverse="true">