实体框架,代码优先:如何使外键不可为空

时间:2014-08-31 14:10:54

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

到目前为止,我发现使用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对*关系(我想要的是什么)。但地址中的FK PersonId可以为空,因为没有属性,我无法在Fluent API中访问此FK。如何将此FK更改为不可空?

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

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

这不正确吗?

2 个答案:

答案 0 :(得分:1)

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

  • 1对*关系
  • FK无法入侵
  • FK未定义为实体类中的属性
  • 级联删除(删除父级删除所有关联记录,此处为地址)

以下声明必须包含在OnModelCreating

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

答案 1 :(得分:0)

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

Here is how

第二,您必须使用流畅的API来执行此操作。

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    modelBuilder.Entity<Person>()
        .HasOptional(a => a.Address)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
    }

For further detail see this link