ForeignKeyAttribute不工作MVC3 EF5

时间:2013-05-14 14:44:33

标签: c# asp.net-mvc entity-framework

我有这些课程:

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上很好,我复制并粘贴而不是输入。

3 个答案:

答案 0 :(得分:0)

SystemRequirements可能需要包含MinimumSystemRequirementsIDRecommendedSystemRequirmentsID字段。我对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(至少)ApplicationSystemRequirements之间的关联之一没有级联删除,例如:

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