我正在尝试使用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成为外键。我在这里错过了什么?任何人都可以指导我实现这一目标的正确方法吗?
答案 0 :(得分:0)
实体框架担心此处删除 - 因为User
与Country
和State
有直接关系,而State
也与{Country
有关系1}}你实际上有一个潜在的循环User
- &gt; State
- &gt; Country
- &gt; User
这意味着如果在删除一个用户时启用了级联删除,则可能会删除数据库中的所有内容。
答案在错误消息中 - 通过禁用某些关系中的级联删除(这是合乎逻辑的 - 删除用户并不意味着您要删除其州和国家/地区),您将避免此风险。正如您可能想象的那样this has come up on SO before.
顺便说一下,Country
上的User
以及State
上的{{1}}看起来像是可疑的非规范化 - 可能有一个很好的理由,但这种情况发生的次数少于你会期待的。