代码优先实体框架虚拟和外键关键混淆

时间:2013-03-21 11:16:45

标签: c# asp.net-mvc entity-framework

所以我有一些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;}
}

我知道它似乎有很多问题,但它围绕着实体框架中的一个主题。感谢您随时回答我的问题。

1 个答案:

答案 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