EF代码优先错误

时间:2015-05-06 10:00:15

标签: entity-framework

我正在尝试使用Code First创建一些表。这是我的代码:

public class Country
{
    [Key]
    public int Id { get; set; }
    public string CountryName { get; set; }
}

public class State
{
    [Key]
    public int Id { get; set; }
    public string StateName { get; set; }
    public int CountryId { get; set; }
    public Country Country { get; set; }
}

public class Customer
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int CountryId { get; set; }
    public int StateId { get; set; }
    public virtual Country Country { get; set; }
    public virtual State State { get; set; }
}

public class ProductContext : DbContext 
{
    public DbSet<Country> Country { get; set; }
    public DbSet<Customer> Customer { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

当我执行此代码时,会发生以下错误:

  

引入FOREIGN KEY约束   &#39; FK_dbo.State_dbo.Country_CountryId&#39;在桌子上&#39;州&#39;可能导致周期   或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO   ACTION,或修改其他FOREIGN KEY约束。无法创建   约束。查看以前的错误。

但我希望状态表中的CountryId成为外键。我在这里错过了什么?任何人都可以指导我实现这一目标的正确方法吗?

1 个答案:

答案 0 :(得分:0)

实体框架担心此处删除 - 因为UserCountryState有直接关系,而State也与{Country有关系1}}你实际上有一个潜在的循环User - &gt; State - &gt; Country - &gt; User这意味着如果在删除一个用户时启用了级联删除,则可能会删除数据库中的所有内容。

答案在错误消息中 - 通过禁用某些关系中的级联删除(这是合乎逻辑的 - 删除用户并不意味着您要删除其州和国家/地区),您将避免此风险。正如您可能想象的那样this has come up on SO before.

顺便说一下,Country上的User以及State上的{{1}}看起来像是可疑的非规范化 - 可能有一个很好的理由,但这种情况发生的次数少于你会期待的。