2013-12-21 19 views
0

删除孤儿,我有以下代码:一个一对多

public class Parent 
{ 
    public int ParentId {get;set;} 
    public ICollection<Child> Children {get;set;} 
} 

public class Child 
{   
    public int ChildId {get;set;} 
    public Parent Parent {get;set;} 
} 

它映射为一个一对多的EF没有任何额外的努力。当我更换新的集合儿童(3个另一个项目)我有孩子,表老孤儿实体是这样的:

Id | Parent_Id 
1  NULL  <-- orphan 
2  NULL  <-- orphan 
3  NULL  <-- orphan 
4  1  <-- new 
5  1  <-- new 
6  1  <-- new 

我想要得到与标识关系明确地摆脱他们:

modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.ParentId }); 
modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId); 

但我没有ParentId属性在儿童中。我只有“父”直接指向父实体。如果我尝试

modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.Parent }); 

我得到一个错误信息:

属性...不能用作实体......一个关键属性,因为属性类型不是有效的密钥类型

有什么办法可以删除所有不必要的孤儿吗?

回答

1

就我所知的识别关系而言,您需要父母的主键作为孩子主键的一部分。 EF将允许您从收藏中删除孩子并将其删除。

只是有导航属性将无法正常工作。确定关系是一个DB层次的概念等都需要暴露的主键ID

见关于这个问题的,我的问题here

1

在我的应用我有一个类似的模式。但是,我不会去除孤儿,而不是去除孤儿。如果我想删除一些子对象我这样做以下列方式:

//This line attaches a parent object to the session. EF will start monitoring it. 
Entry(parent).State = EntityState.Modified; 

//This code is responsible for finding children to delete. 
foreach (var child in parent.Children.Where(ch => ch.Deleted)) 
    //This line says EF that given child should be removed. 
    //This line also causes that an object will be removed from Children collection. 
    Entry(child).State = EntityState.Deleted; 

SaveChanges(); 

删除是,如果我想删除一个对象,我设置为的属性。