1

我有这些课程:

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;}
}

所以我的问题是为什么这不起作用?我什至尝试引用Applicationin SystemRequirements,但没有用?

请不要因为拼写错误而拖拉这篇文章。我的代码在 VS 上很好,我复制并粘贴而不是输入。

4

3 回答 3

0

SystemRequirements可能需要有MinimumSystemRequirementsIDandRecommendedSystemRequirmentsID字段。我对 EF FK 关系的理解是,它着眼于模型中您调用 FK 的元素的值,然后将其用于链接。

尝试这个:

public class SystemRequirements : DbEntity
{
   public string OS {get;set;}
   public Guid MinimumSystemRequirementsId {get;set;}
   public Guid RecommendedSystemRequirementsId {get;set;}
}
于 2013-05-14T14:58:07.387 回答
0

您必须告诉 EF (至少)之间的关联之一Application没有SystemRequirements级联删除,例如:

modelBuilder.Entity<Application>().HasRequired(a => a.MinimumSystemRequirements)
    .WithMany().HasForeignKey(a => a.MinimumSystemRequirementsId)
    .WillCascadeOnDelete(false);

(在上下文的重载中OnModelCreating)。

于 2013-05-14T17:59:09.423 回答
0

嘿嘿嘿好消息。我发现了问题!

我记得那天(几个月前)有人告诉我,为了在 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

于 2013-05-15T08:55:24.430 回答