我有这些课程:
public class SystemRequirements : DbEntity
{
public string OS {get;set;}
}
public class Application : DbEntity
{
public string Name {get;set;}
public virtual SystemRequirements MinimumSystemRequirements {get;set;}
public Guid MinimumSystemRequirementsId {get;set;}
public virtual SystemRequirements RecommendedSystemRequirements {get;set;}
public Guid RecommendedSystemRequirementsId {get;set;}
}
我收到错误消息:引入外键约束可能会导致循环或多个级联路径。
DbEntity
是一个包含主键的抽象类。 [Key] public Guid Id {get;set;}
所以,我将Application
更改为:
public class Application : DbEntity
{
public string Name {get;set;}
public virtual SystemRequirements MinimumSystemRequirements {get;set;}
[ForeignKey("MinimumSystemRequirements")]
public Guid MinimumSystemRequirementsId {get;set;}
public virtual SystemRequirements RecommendedSystemRequirements {get;set;}
[ForeignKey("RecommendedSystemRequirements")]
public Guid RecommendedSystemRequirementsId {get;set;}
}
所以我的问题是为什么这不起作用?我甚至尝试在Application
中引用SystemRequirements
,这不起作用?
请不要因拼写错误而在此帖子上搜索。我的代码在VS上很好,我复制并粘贴而不是输入。
答案 0 :(得分:0)
SystemRequirements
可能需要包含MinimumSystemRequirementsID
和RecommendedSystemRequirmentsID
字段。我对EF FK关系的理解是它查看了你调用FK的Element值的模型,然后用它进行链接。
试试这个:
public class SystemRequirements : DbEntity
{
public string OS {get;set;}
public Guid MinimumSystemRequirementsId {get;set;}
public Guid RecommendedSystemRequirementsId {get;set;}
}
答案 1 :(得分:0)
您必须告诉EF(至少)Application
和SystemRequirements
之间的关联之一没有级联删除,例如:
modelBuilder.Entity<Application>().HasRequired(a => a.MinimumSystemRequirements)
.WithMany().HasForeignKey(a => a.MinimumSystemRequirementsId)
.WillCascadeOnDelete(false);
(在上下文中OnModelCreating
的重载。)
答案 2 :(得分:0)
Heyyyyy好消息。我想出了这个问题!
我记得当天(几个月前)我被告知为了在Code First中使用Cascade On Delete
启用Attributes
,您必须这样做:
public Guid CascadeOnId {get;set;}
public virtual Cascade CascadeOn {get;set;}
然而,在我知道我一直在使用它之前:
public virtual Cascade CascadeOff {get;set;}
我获得循环删除的原因是因为第一个示例将删除HDD(如果存在),但HDD必须始终存在其第二个实例,例如:
public Guid FirstCascadeId {get;set;}
public virtual Cascade FirstCascade {get;set;}
public Guid SecondCascadeId {get;set;}
public virtual Cascade SecondCascade {get;set;}
因此,实体框架担心如果删除级联实体,它必须删除它的关联父级,在删除父级时必须删除所有关联的级联。这是循环开始的地方。我希望我有某种意义。
要关闭Cascade On Delete
,您不得指定与该虚拟相关的Guid
ID。因此,为了完成上述工作,您可以使用:
public virtual Cascade FirstCascade {get;set;}
public virtual Cascade SecondCascade {get;set;}
如果你愿意,你可以打开第一个Cascade On Delete
,只要确保其中一个没有它并且它可以正常工作:)
我通过使用Model First找到了答案,然后在我头顶上方放了一个巨大的发光灯泡:P