2013-07-17 75 views
0

我有一个实体为许多不同的实体定义属性。EF多个外键只需要1个

例如。

class user{ 
ICollection<PropertyEntity> properties {get;set;} 
} 

class company{ 
ICollection<PropertyEntity> properties {get;set;} 
} 

当我从用户或公司删除一个PropertyEntity。

myUser.properties.Remove(someProperty); 

PropertyEntity不会被删除,它只是将其外键设置为null。

我知道我可以使用[Key]注释来定义外键。但据推测,这将需要两个键而不是?

如何获取EF来构建该关系,以便用户或公司可以拥有多个PropertyEntity。但是如果没有用户或公司,PropertyEntity会被删除吗?

+1

你真的在“删除”PropertyEntity或者只是从集合中删除它吗? –

+0

所以你想级联删除?,你是否定义了与流利API的关系? – SOfanatic

+0

这不是级联删除,因为父实体没有被删除。我正在做的是从集合中删除它。但它不会从数据库中删除。 我在建议如何用流利的API来定义它。 –

回答

0

如果关系是可选的,则无法定义关系,因此从导航集合中删除子项也会将其从数据库中删除。

你必须要么调用DbSet<T>.Remove为孩子...

myUser.properties.Remove(someProperty); 
if (!someProperty.CompanyId.HasValue) 
    context.PropertyEntities.Remove(someProperty); 

...(这也将自动从集合中删除子),或者你可以尝试删除“孤立”的孩子覆盖SaveChanges更改提交前:

public override int SaveChanges() 
{ 
    PropertyEntities.Local 
     .Where(p => !p.UserId.HasValue && !p.CompanyId.HasValue) 
     .ToList() 
     .ForEach(p => PropertyEntities.Remove(p)); 

    return base.SaveChanges(); 
} 

这种方法在更多的细节上Arthur Vickers' blog解释。

设置一个identifying relationship(这将支持从导航集合中删除数据库时从数据库中删除)确实只有在需要关系时才可能,因此它不适用于您。

相关问题