【问题标题】:Entity Framework, Code First: How can i make a Foreign Key Not-Nullable实体框架,代码优先:如何使外键不可为空
【发布时间】:2014-10-24 21:52:40
【问题描述】:

到目前为止,我发现使用 Fluent API 更改数据库模型的所有可能性都假设我要编辑的属性也作为实体中的属性存在。但是我不知道如何更改属性的属性,这不是实体类中的属性。

例子:

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public List<Address> Addresses { get; set; }

    public Person()
    {
        this.Addresses = new List<Address>();
    }
}
public class Address
{
    public int AddressId { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

现在 Code First 创建一个数据库,其中 Addresses 表将 PersonId 作为 FK,因此具有 1-to-* 关系(我想要什么)。但是 Addresses 中的 FK PersonId 可以为空,并且我无法在 Fluent API 中访问此 FK,因为没有属性。如何将此 FK 更改为不可为空?

另外,当我想删除一个人时,EF 不允许我这样做,因为有一个关联的地址。我认为行为是:

  • nullable FK:删除有问题的记录,将子记录FK设置为​​null
  • 不可为空:错误,或删除记录以及所有关联记录(取决于级联规则)

这不正确吗?

【问题讨论】:

    标签: c# sql .net entity-framework foreign-key-relationship


    【解决方案1】:

    下面的 Fluent API 指令为我做了,所以要实现

    • 一对*关系
    • FK 不可为空
    • FK 未定义为实体类中的属性
    • 级联删除(删除父级删除所有关联记录,此处为地址)

    以下语句必须包含在 OnModelCreating 中

    modelBuilder.Entity<Person>().HasMany(a => a.Addresses).WithRequired().WillCascadeOnDelete(true);
    

    【讨论】:

      【解决方案2】:

      首先你必须使外键可以为空。

      Here is how

      其次,您必须使用 fluent API 来执行此操作。

      尝试将以下内容添加到您的数据库上下文中

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
          {
      
          modelBuilder.Entity<Person>()
              .HasOptional(a => a.Address)
              .WithOptionalDependent()
              .WillCascadeOnDelete(true);
          }
      

      For further detail see this link

      【讨论】:

      • 对不起,我把话题搞砸了。请参阅详细的开篇文章:实际上我想要一个不可为空的 FK。对于第二个:当我使用它时,Code First 想要删除 Addresses 上的 FK 列,并在 Person 表中添加一个 FK,所以我不再有 1-to-* 关系
      • 我明白了!我会创建一个答案并将其标记为已接受,尽管您的帖子给了灵感,所以谢谢!
      • 你能告诉我这是否是预期的行为。 stackoverflow.com/questions/45571025/…
      猜你喜欢
      • 2011-08-05
      • 1970-01-01
      • 2013-01-15
      • 2017-07-16
      • 2012-05-10
      • 2015-02-24
      • 2021-01-05
      • 2011-08-05
      相关资源
      最近更新 更多