Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已删除集合项上的Nhibernate_C#_.net_Nhibernate_Fluent Nhibernate - Fatal编程技术网

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
  • 不要将其保存在父级的集合中(这里我不确定,但如果需要,我们有下面的解决方案)
1) 为了保持这种关系,我们不会一直调用delete

我们可以在父级
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
  • 不要将其保存在父级的集合中(这里我不确定,但如果需要,我们有下面的解决方案)
1) 为了保持这种关系,我们不会一直调用delete

我们可以在父级
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将注入它自己的代码。但我希望它从