2013-03-21 97 views
0

所以我有一些POCO类:代码第一次实体框架虚拟和外键困惑

public class Device : DbEntity 
{ 
    public string DeviceName {get;set;} 
} 
public class AUT : DbEntity 
{ 
    public string ApplicationName {get;set;} 
} 
public class Setup : DeviceAppDbEntity 
{ 
    public bool Worked {get;set;} 
} 

public class DbEntity 
{ 
    public Guid ID {get;set;} 
} 
public class DeviceAppDbEntity : DbEntity 
{ 
    public virtual AUT ApplicationUnderTesting {get;set;} 
    public virtual Device DeviceUnderTesting {get;set;} 
} 

所以,如果我想删除一个AUT(应用程序),那么我几乎肯定会得到一个错误,因为设置有一个外应用程序的关键。我被告知,如果你添加

public class DeviceAppDbEntity : DbEntity 
{ 
    public virtual AUT ApplicationUnderTesting {get;set;} 
    public Guid ApplicationUnderTestingId {get;set;} // THIS LINE ADDED 

    public virtual Device DeviceUnderTesting {get;set;} 
} 

然后级联删除将启用。它是否正确?

当我现在访问设置

_repository.Setups.FirstOrDefault(x => x.ID.Equals(setupID)); 

的导航属性virtual AUT & virtual Device应该会自动填写? Guid ApplicationUnderTestingId会自动填写吗?

当我想保存我的Setup实体时,我可以只填写nav属性吗?或者我是否还必须填写Guid ApplicationUnderTestingId字段,或者我是否反过来填写Guid ApplicationUnderTestingId

entityToSave.AUT = _repository.AUTs.FirstOrDefault(x => x.ID.Equals(vm.AppID)); 

entityToSave.ApplicationUnderTestingId= vm.AppID; 
entityToSave.AUT = _repository.AUTs.FirstOrDefault(x => x.ID.Equals(vm.AppID)); 

entityToSave.ApplicationUnderTestingId= vm.AppID; 

这有点令人困惑。当你定义一个List<entities>因为当你删除它包含列表中的实体,它变得更糟。它抱怨列表中存在关系的实体,您如何在这些关系上启用级联删除?

public class Blog: DbEntity 
{ 
    public string Name {get;set;} 
    public virtual Member {get;set;} 

    public List<Comment> Comments {get;set;} 
} 

我知道这似乎是一个很大的问题,但它是围绕在实体framework.Thank一个话题你随时花回答我的问题。

回答

2

回答这个问题。

Cascade On Delete是当你这样做的导航性能,如

public virtual SomeClass {get;set;} 
public Guid SomeClassId {get;set;} 

您可以填写任何一方的支持,它会保存到数据库中。

No Cascade On Delete

public virtual SomeClass SomeClass {get;set;} 

当你从数据库中读取我做我喜欢下面:

var item = _repository.SomeClasses.FirstOrDefault(x => x.Id.Equals(id)); 

的导航属性将只填写当你想访问他们,延迟加载,因为我用关键字virtual

只要List<Post>去,如果你这样做:

public class Post 
{ 
    public virtual Blog Blog {get;set;} 
    public Guid BlogId {get;set;} 
} 

然后,当一个博客被删除,所有与它关联的帖子将被删除。如果您删除BlogId,我还没有试过看看会发生什么,但我猜测,当您删除博客时,没有任何帖子会被删除。 Blog => Post模型不是用来说明为什么要这样做的模型。

我想我已经回答了我所有的问题。总而言之,关于是否设置了Cascade On Delete,全部取决于public Guid SomeClassId {get;set;}