我有一个父对象,它与一个ISet子对象有一对多的关系.子对象具有唯一约束(PageNum以及ContentID- 父对象的外键).
<set name="Pages" inverse="true" cascade="all-delete-orphan" access="field.camelcase-underscore">
<key column="ContentId" />
<one-to-many class="DeveloperFusion.Domain.Entities.ContentPage, DeveloperFusion.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>
Run Code Online (Sandbox Code Playgroud)
我打的问题是,如果我删除ContentPage从父集合元素,然后添加与同一事务中相同的唯一密钥一个新的...你得到一个违反唯一约束,因为NHibernate的尝试执行插入之前的删除.
有没有办法强制NHibernate首先执行删除?
我想删除具有许多用户组的用户,但这些用户组不属于该用户:其他用户也可以使用此用户组.即使没有用户引用用户组,也可以存在用户组.
我想映射多对多关系,这样如果用户被删除,关系会自动删除但不是用户组?
我试过,Cascade.All因为我认为多对多的级联会影响关系但不会影响另一方.我以为只会Cascade.AllDeleteOrphan删除其他人.显然我错了.
似乎我不理解级联规则.有人可以向我提供明确的解释,也许也可以达到我的目标吗?
谢谢
免责声明:我是一名NHibernate noobie,所以希望这个问题有道理.我有两个类之间的多对多关系,比如......
public class Entity1
{
public virtual Guid EntityId { get; set; }
public virtual IList<Entity2> Entity2List;
}
Public class Entity2
{
public virtual Guid EntityId { get; set; }
public virtual IList<Entity1> Entity1List;
}
Run Code Online (Sandbox Code Playgroud)
我在两个类映射中都添加了一个多对多关系,定义了一个关联表但不确定要使用哪个级联选项.我希望能够创建一个新的Entity1实例,将新的Entity2实例添加到它的列表中,调用Save,并将两者都插入到数据库中(反之亦然).删除实体时,它应删除与子实体的任何关联,但不删除子实体本身.我应该使用cascade ="save-update"吗?
我有一个NHibernate实现的项目并使用Lazy Loading.我在这个项目中有两个班:人和家庭.这两者之间的关系是聚合,是指Person有一个Person列表.映射是:
<class name="Person" table="Person_Person" >
<id name="Id" type="Int64" unsaved-value="0">
<generator class="native" />
</id>
<bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
<key column="Person_id_fk"/>
<one-to-many class="Domain.Entities.Family,Domain.Entities"/>
</bag>
</class>
Run Code Online (Sandbox Code Playgroud)
在这个项目中,我通过ID获取一个人然后删除一个家庭的人.
Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
if (fam.Name == "Jaun")
SessionInstance.Delete(fam);
Run Code Online (Sandbox Code Playgroud)
系列未删除,因为通过此消息抛出异常:
deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]
我怎样才能删除一个人的家庭?
目标:
创建一个父子关系,以便修改父项的子项列表将传播给所有子项,并让NHibernate完成繁重的任务.父子关系将Has-Many在自引用表上.
问题:
任何删除父(根)对象的尝试都会导致异常,而不是删除子对象的预期行为.
我正在使用的东西的版本:
Microsoft SQL Server Management Studio版本10.0.4064.0
FluentNHibernate版本1.3
NHibernate版本3.2.0.4
下面是我用来复制此行为的当前类对象和表结构的集合.
// Entity
class Task
{
ID { get; set; }
public virtual IList<Task> Children { get; set; }
public virtual byte[] Version { get; protected set; }
public virtual bool IsNew() { return ID <= 0; }
public Task()
{
this.Children = new System.Collections.Generic.List<Task>();
}
// Other properties excluded for brevity
}
Run Code Online (Sandbox Code Playgroud)
// Map
class TaskMap : ClassMap<Task>
{
TaskMap()
{
Table("Task");
Id(x => x.ID, …Run Code Online (Sandbox Code Playgroud) 我有很多关系:
产品有很多类别,类别有很多产品.
说我有
Shopping Category
Food Category
Product A - Shopping Category, Food Category
Product B - Shopping Category
Run Code Online (Sandbox Code Playgroud)
现在我删除Shopping Category.我希望Product A删除引用Shopping Category,我想Product B完全删除.
我最终会:
Product A - Food Category.
Run Code Online (Sandbox Code Playgroud)
我如何在nhibernate中执行此操作(我使用流利的nhibernate).
我尝试使用Cascade DeleteOrphan,AllDeleteOrphan但当我这样做并删除购物时,产品A和B都被删除了.
public class CategoryMapping : ClassMap<Category>
{
public CategoryMapping()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();
HasManyToMany(x => x.Products).Cascade.DeleteOrphan();
}
}
public class ProductMapping : ClassMap<Product>
{
public ProductMapping()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();
HasManyToMany(x …Run Code Online (Sandbox Code Playgroud) nhibernate many-to-many fluent-nhibernate nhibernate-cascade cascading-deletes
我搜索了很多地方,仍然无法找到我正在寻找的答案.
我正在使用NHibernate 3.2 - 按代码映射
我有以下映射文件:
public class ParentMapping: EntityMapping<Parent>
{
public ParentMapping()
{
Set(x => x.Children, map =>
{
map.Cascade(Cascade.All);
map.Inverse(true);
}, r => r.OneToMany());
}
}
public class ChildMapping: JoinedSubclassMapping<Child> // This is a subclass of something else.
{
public RequiredSkillMapping()
{
ManyToOne(x => x.Parent, map => { map.NotNullable(true); });
}
}
Run Code Online (Sandbox Code Playgroud)
级联保存工作正常.
session.Save(parent) will save the children and associate them correctly.
Run Code Online (Sandbox Code Playgroud)
当我试着打电话时:
var parent = session.Get<Parent>(1);
parent.Children.Clear();
session.Save(parent); or session.SaveOrUpdate(parent) or session.Update(parent)
Run Code Online (Sandbox Code Playgroud)
实体保持与父母相关联.
我通过调用它来工作:
foreach(var child in …Run Code Online (Sandbox Code Playgroud) 这是尝试在Comment.BlogArticleID中插入null.
出现以下GenericADOException:"无法插入:[NHibernate__OneToMany.BO.Comment] [SQL:INSERT INTO注释(名称)VALUES(?);选择SCOPE_IDENTITY()]"
出现以下内部异常:"无法将值NULL插入列'BlogArticleID',表'Relationships_Test_OneToMany.dbo.Comment';列不允许空值.INSERT失败.\ r \n语句已终止."
我需要一个单向映射.提供的答案还在谈论双向映射.
NHibernate级联保存是否适用于本机ID生成器?
BlogArticle {ID,Name},如果是ID,则Identitity = true.
注释{ID,Name,BlogArticleID},如果是ID,则Identitity = true.
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernate__OneToMany.BO"
namespace="NHibernate__OneToMany.BO"
default-access="property">
<class name="Comment" table="Comment">
<id name="ID">
<generator class="native" />
</id>
<property name="Name" />
</class>
</hibernate-mapping>
public class Comment
{
private int _id;
public virtual int ID
{
get { return _id; }
set { _id = value; }
}
public Comment()
{
}
public Comment(string name)
{
this._name = name;
}
private string _name;
public virtual string …Run Code Online (Sandbox Code Playgroud)