我收到此错误
引入FOREIGN KEY约束 表'Regions'上的'FK_dbo.Regions_dbo.Countries_CountryId'可能导致 循环或多个级联路径。指定ON DELETE NO ACTION或ON 更新无操作,或修改其他FOREIGN KEY约束。不能 创建约束。查看以前的错误。
我想知道这是否意味着我的数据库设计不好?我读到你关闭了瀑布或类似的东西,但我不确定这是否将问题彻底解决了。
我只是让EF通过我的域类生成我的表(此时我没有使用任何数据注释或流畅的映射)。
public class Country
{
public Country()
{
this.Stores = new List<Store>();
this.Regions = new List<Region>();
Id = GuidCombGenerator.GenerateComb();
}
public Guid Id { get; private set; }
private string name;
public string Name
{
get { return name; }
set
{
name = value.Trim();
}
}
private string code;
public string Code
{
get { return code; }
set
{
code = value.Trim();
}
}
public virtual ICollection<Store> Stores { get; set; }
public virtual ICollection<Region> Regions { get; set; }
}
public class City
{
public City()
{
this.Stores = new List<Store>();
Id = GuidCombGenerator.GenerateComb();
}
public Guid Id { get; private set; }
private string name;
public string Name
{
get { return name; }
set
{
name = value.Trim();
}
}
public Guid RegionId { get; set; }
public virtual Region Region { get; set; }
public virtual ICollection<Store> Stores { get; set; }
}
public class Region
{
public Region()
{
this.Cities = new List<City>();
this.Stores = new List<Store>();
Id = GuidCombGenerator.GenerateComb();
}
public Guid Id { get; private set; }
private string state;
public string State
{
get { return state; }
set
{
state = value.Trim();
}
}
public Guid CountryId { get; set; }
public virtual ICollection<City> Cities { get; set; }
public virtual Country Country { get; set; }
public virtual ICollection<Store> Stores { get; set; }
}
public class Store
{
public Store()
{
Id = GuidCombGenerator.GenerateComb();
Users = new List<User>();
}
public Guid Id { get; private set; }
public Guid CountryId { get; set; }
public Guid CityId { get; set; }
public Guid RegionId { get; set; }
public virtual City City { get; set; }
public virtual Country Country { get; set; }
public virtual Region Region { get; set; }
public virtual ICollection<User> Users { get; set; }
}
可能是因为商店吗?
答案 0 :(得分:54)
模型中的所有关系都是必需,因为所有外键属性(CountryId
,RegionId
,CityId
)不可为空。对于所需的一对多关系,EF将按惯例启用级联删除。
Country
和Region
有Store
表的多个删除路径,例如,如果删除Country
,则可以通过删除相关的Store
三个不同的级联路径(SQL Server不允许):
Country
- &gt; Store
Country
- &gt; Region
- &gt; Store
Country
- &gt; Region
- &gt; City
- &gt; Store
您必须通过使用Fluent API禁用级联删除或将某些关系定义为可选(具有可为空的外键Guid?
)来避免此类不明确的删除路径。
或者从除Stores
之外的所有实体中删除City
集合(以及反向引用和FK属性)。对我来说,这些集合看起来多余,因为您可以通过导航Country
集合找到Regions.Cities.Stores
中的所有商店。
答案 1 :(得分:24)
在modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
文件的OnModelCreating
方法中添加DataContext
,如下所示:
public class YourDataContext : DbContext
{
public DbSet<Country> Countries{ get; set; }
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
}
同样的问题:entity-framework-how-to-solve-foreign-key-constraint-may-cause-cycles-or-multi