0

我有 2 节课:

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;}
}

当我从 MyClass.Entries 中删除一个项目时,我实际上并不想删除它,也不想杀死它。我只想将 Entry.IsDeleted 设置为 true,并且我仍然希望 Entry 保留 myClass 的 ID;

myClassObj.Entries.Remove(myEntry); // after this line myEntry.MyCls.Id 
                                    // should stay intact. myEntry.IsDeleted 
                                    // should be set to true;

我怎样才能做到这一点?我尝试使用拦截器,但无法使其正常工作。

编辑

映射:

除了表格映射我使用的字段:

MyClassMap : ...
{
  HasMany(x => Entries).KeyColumn("MyClsId");
}
4

5 回答 5

1

看起来您实际上并不想从集合中删除它,也许在上面放置一个方法会更有Entry意义

public void Delete(){
    IsDeleted = true;
}

而不是

myClassObj.Entries.Remove(myEntry);

myEntry.Delete();
于 2013-05-17T13:24:25.797 回答
1

实现您想要的一种方法不是直接使用实体,而是使用 DTO,它是您的实体的副本(包含所有集合项)。您对 DTO 执行删除操作(因此已删除的集合项对应用程序不可见),稍后当您要保存实体时,只需将其与 DTO 同步(对于已删除的集合项,您将 IsDeleted 标志设置为 true )。多一点工作,但它实现了你想做的事情。

于 2013-05-17T19:07:12.563 回答
1

如果我确实正确理解了您的情况,您希望最后有一个Delete操作:

  • 保持关系
  • 将项目标记为IsDeleted
  • 不要将它保存在父级的集合中(这里我不确定,但如果需要,我们有下面的解决方案)

1)为了保持关系,我们根本不会一直调用删除。

我们可以在 Parent 上引入一个方法RemoveEntry

public class MyClass 
{
  public virtual void RemoveEntry(Entry entry) // or by index, name
  {
     // some checks over Entries collection
     entry.IsDeleted = true;
  }
}

当 MyClass 实例更新时session.Update(myClass),所有条目也将是

2) 将其标记为IsDeleted,我们将只附加级联(在此处查看更多流利映射

MyClassMap : ...
{
  HasMany(x => Entries)
   .KeyColumn("MyClsId")
   .Cascade.All()
}

3)要从父子集合的延迟where加载中删除该项目,我们可以在集合映射中附加一个子句。请参见此处的示例:映射中的 where 子句

MyClassMap : ...
{
  HasMany(x => Entries)
    .KeyColumn("MyClsId")
    .Cascade.All()
    .Where("IsDeleted = 0"); // that will load only IsDeleted == false lazily
}

有关文档中 where 子句的更多信息:6.2。映射集合

于 2013-05-17T14:07:51.680 回答
1

在这种情况下,您必须更新您的实体而不是删除。尝试更改您的映射

// set cascade to all to add/update/delete this childs by parent.
HasMany(x => Entries).KeyColumn("MyClsId").Cascade.All();

ondeMyClass创建一个方法来更新它:

public class MyClass{
  ...
  public virtual ICollection<Entry> Entries {get;set;}

  public void DeleteEntry(Entry entry)
  {
      entry.IsDelete = true;   
  }
}

当您想将一个Entry对象设置为 IsDeleted 以true调用DeleteEntry传递该对象的方法并仅保留该MyClass实例时,子项将被保留在一起。

session.SaveOrUpdate(myClassObj);
于 2013-05-17T13:45:53.520 回答
0

我必须在 MyClass 中创建一个附加属性,这似乎是唯一可行的解​​决方案。

public virtual IEnumerable<Entry> NotDeletedEntries{get{return Entries.Where(x=>x.IsDeleted == false);}}
于 2013-05-21T10:24:49.530 回答