C# 已删除集合项上的Nhibernate
我有两门课:C# 已删除集合项上的Nhibernate,c#,.net,nhibernate,fluent-nhibernate,C#,.net,Nhibernate,Fluent Nhibernate,我有两门课: public class Entry{ ... public virtual IsDeleted {get;set;} public virtual int MyClsId {get;set;} public virtual MyClass MyCls {get;set;} } public class MyClass{ ... public virtual ICollection<Entry> Entries {get;set;} } 我该
public class Entry{
...
public virtual IsDeleted {get;set;}
public virtual int MyClsId {get;set;}
public virtual MyClass MyCls {get;set;}
}
public class MyClass{
...
public virtual ICollection<Entry> Entries {get;set;}
}
我该怎么做?我试过使用拦截器,但没有成功
编辑
映射:
除了映射我使用的字段外:
MyClassMap : ...
{
HasMany(x => Entries).KeyColumn("MyClsId");
}
看起来你并不是真的想从集合中删除它,也许在
Entry
上放一个方法会更有意义
public void Delete(){
IsDeleted = true;
}
而不是
myClassObj.Entries.Remove(myEntry);
做
看起来你并不是真的想从集合中删除它,也许在
Entry
上放一个方法会更有意义
public void Delete(){
IsDeleted = true;
}
而不是
myClassObj.Entries.Remove(myEntry);
做
在这种情况下,您必须更新实体,而不是删除。尝试使用更改映射
// set cascade to all to add/update/delete this childs by parent.
HasMany(x => Entries).KeyColumn("MyClsId").Cascade.All();
在MyClass
上创建一个方法来更新它:
public class MyClass{
...
public virtual ICollection<Entry> Entries {get;set;}
public void DeleteEntry(Entry entry)
{
entry.IsDelete = true;
}
}
在这种情况下,您必须更新实体,而不是删除。尝试使用更改映射
// set cascade to all to add/update/delete this childs by parent.
HasMany(x => Entries).KeyColumn("MyClsId").Cascade.All();
在MyClass
上创建一个方法来更新它:
public class MyClass{
...
public virtual ICollection<Entry> Entries {get;set;}
public void DeleteEntry(Entry entry)
{
entry.IsDelete = true;
}
}
如果我正确理解了您的场景,您希望有一个删除操作,该操作将在最后:
- 保持关系
- 将项目标记为
IsDeleted
- 不要将其保存在父级的集合中(这里我不确定,但如果需要,我们有下面的解决方案)
removentry
public class MyClass
{
public virtual void RemoveEntry(Entry entry) // or by index, name
{
// some checks over Entries collection
entry.IsDeleted = true;
}
}
更新MyClass实例时,所有条目也将被删除
2) 要将其标记为IsDeleted
,我们只需附加级联(参见此处的更多内容)
3) 要从父子集合的延迟加载中删除该项,我们可以将where
子句附加到集合映射。请参见此处的示例:
关于文档中where子句的更多信息:如果我正确理解了您的场景,您希望有一个删除操作,该操作将在最后:
- 保持关系
- 将项目标记为
IsDeleted
- 不要将其保存在父级的集合中(这里我不确定,但如果需要,我们有下面的解决方案)
removentry
public class MyClass
{
public virtual void RemoveEntry(Entry entry) // or by index, name
{
// some checks over Entries collection
entry.IsDeleted = true;
}
}
更新MyClass实例时,所有条目也将被删除
2) 要将其标记为IsDeleted
,我们只需附加级联(参见此处的更多内容)
3) 要从父子集合的延迟加载中删除该项,我们可以将where
子句附加到集合映射。请参见此处的示例:
有关文档中where子句的更多信息:实现所需功能的一种方法不是使用实体目录,而是使用一个DTO,它是实体的副本(包含所有集合项)。您对DTO执行删除操作(因此已删除的集合项对应用程序不可见),稍后,当您要保存实体时,只需将其与DTO同步(对于已删除的集合项,您将IsDeleted标志设置为true)。再多做一点工作,但它实现了您想要做的事情。实现您想要做的事情的一种方法不是直接使用实体,而是使用一个DTO,它是您的实体(以及所有集合项)的副本。您对DTO执行删除操作(因此已删除的集合项对应用程序不可见),稍后,当您要保存实体时,只需将其与DTO同步(对于已删除的集合项,您将IsDeleted标志设置为true)。需要做更多的工作,但它实现了您想要做的。我必须在MyClass中创建一个附加属性,这似乎是唯一可行的解决方案
public virtual IEnumerable<Entry> NotDeletedEntries{get{return Entries.Where(x=>x.IsDeleted == false);}}
public虚拟IEnumerable NotDeletedEntries{get{return Entries.Where(x=>x.IsDeleted==false);}
我不得不在MyClass中创建一个附加属性,这似乎是唯一可行的解决方案
public virtual IEnumerable<Entry> NotDeletedEntries{get{return Entries.Where(x=>x.IsDeleted == false);}}
public虚拟IEnumerable NotDeletedEntries{get{return Entries.Where(x=>x.IsDeleted==false);}
此集合的映射情况如何?@FelipeOriani查看编辑此集合的映射情况如何?@FelipeOriani查看编辑的想法,但是如果这样做,myClassObj.Entries仍然包含已删除的项,尽管它不应该包含。(我将使用拦截器过滤删除的条目,但它仅在我创建对象时起作用)@gisek,在entries
属性的get
中,您可以尝试类似return\u entries的操作。其中(x=>!x.IsDeleted)代码>。这样,它仍然在NHibernate的集合中,但在您调用myClassObj.Entries
@valverij时不会显示此属性是虚拟的。它被Nhibernate覆盖,所以我在其中输入的任何内容都不重要。对,但是你担心它被Nhibernate看到,还是担心它被应用程序的其他部分看到?@valverij我一点也不担心。只是说我放在那里的代码永远不会被执行,因为Nhibernate将注入它自己的代码。考虑到这一点,但如果这样做,myClassObj.Entries仍然包含删除的项,尽管它不应该包含。(我将使用拦截器过滤删除的条目,但它仅在我创建对象时起作用)@gisek,在entries
属性的get
中,您可以尝试类似return\u entries的操作。其中(x=>!x.IsDeleted)代码>。这样,它仍然在NHibernate的集合中,但在您调用myClassObj.Entries
@valverij时不会显示此属性是虚拟的。它被Nhibernate覆盖,所以我在其中输入的任何内容都不重要。对,但是你担心它被Nhibernate看到,还是担心它被应用程序的其他部分看到?@valverij我一点也不担心。只是说我放在那里的代码永远不会被执行,因为Nhibernate将注入它自己的代码。但我希望它从