Entity Framework,Code First:如何使外键非空?

4

到目前为止,我发现使用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,因此存在一对多关系(这是我想要的)。但是 Addresses 中的 FK PersonId 是可空的,并且由于没有属性,我无法在 Fluent API 中访问此 FK。如何将此 FK 更改为非空?
此外,目前当我想删除一个人时,EF 不允许我这样做,因为有相关地址。我认为行为应该是:
- 可空 FK:删除相关记录,将子记录 FK 设置为空 - 不可空:错误或一起删除所有相关记录(取决于级联规则)
这不正确吗?
2个回答

4
以下Fluent API指令对我很有帮助,以实现:
  • 1对*关系
  • 外键不可为空
  • 外键在实体类中未定义为属性
  • 级联删除(删除父项会删除所有相关记录,这里是地址)
为了实现上述内容,必须在OnModelCreating中包含以下语句。
modelBuilder.Entity<Person>().HasMany(a => a.Addresses).WithRequired().WillCascadeOnDelete(true);

0
首先,您必须使外键可为空。

这里是如何操作的

其次,您将需要使用流畅的API来完成此操作。
尝试将以下内容添加到您的DB上下文中。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

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

如需更详细信息,请查看此链接


对不起,我搞错了主题。请查看详细的开头帖子:实际上我想要一个非空的FK。至于第二个问题:当我使用这个时,Code First想要删除Addresses表中的FK列,并在Person表中添加一个FK,所以我不再拥有1对*的关系了。 - user3343508
我知道了!我会创建一个回答并标记为已接受,虽然你的帖子给了我灵感,所以谢谢你! - user3343508
请问这是否是预期行为。https://stackoverflow.com/questions/45571025/how-to-correctly-set-foreign-key-constraint-in-one-to-many-relationship-in-code/45572561#45572561 - Unbreakable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接