所以我有一些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(应用程序),那么我几乎肯定会收到错误,因为安装程序有一个App的外键。我被告知如果你添加
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
实体时,我可以填写导航属性吗?或者我是否必须填写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;}
}
我知道它似乎有很多问题,但它围绕着实体框架中的一个主题。感谢您随时回答我的问题。
答案 0 :(得分: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
模型不是用来证明你为什么要这样做的模型。
我想我已回答了所有问题。总而言之,这一切都取决于public Guid SomeClassId {get;set;}
是否设置Cascade On Delete
。