这个映射有什么问题?

时间:2011-10-18 22:13:55

标签: entity-framework-4 entity-framework-4.1 ef-code-first

我想根据下面的类字典创建下表。我添加记录时会出现异常。这个映射有什么问题?如果我将类“B”的Child属性指向另一个类(例如“C”),则此代码有效。

database table 
    table A {id, name}
    table B {parentId, childId, Type}

类和映射

Public class A
{
   public int Id {get;set;}
   public string Description {get;set;}
}

Public class B
{
   [Key, Column(Order=0)]
   public int ParentId {get;set;}
   [Foreignkey("ParentId")]
   public A Parent {get;set;}

   [Key, Column(Order=1)]
   public int ChildId {get;set;}
   [Foreignkey("ChildId")]
   public A Child {get;set;}

   [Key, Column(Order=2)]
   public string Type {get;set;}

}

更新

错误消息是:在表'B'上引入FOREIGN KEY约束'B_Parent'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。

谢谢,

阿什拉夫

2 个答案:

答案 0 :(得分:3)

阅读以下帖子后,我找到了解决方案。 http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

Entity Framework Code First - Defining Relationships/Keys

这是SQL Server错误。类'A'在类'B'中引用两次。 Code First尝试为类'B'中的Parent和Child列启用级联删除,这会导致异常。

修复是在B类中手动覆盖其中一个级联选项为false。我不知道如何将CascadeOnDelete选项设置为字典属性。但这里是流利的api。

 HasRequired(x => x.Parent)
         .WithMany()
         .HasForeignKey(x => x.ParentId)
         .WillCascadeOnDelete(false);

我希望EF团队尝试为我们编写Code First配置(Fluent API)手册的综合指南。 AdventureWorks-2008数据库是一个很好的候选者。

答案 1 :(得分:0)

这个异常是特定于SQL服务器的。如果你关闭了关系的级联,它就会消失。默认Ef会为你打开它。你可以通过流畅的api来做到这一点。 在关系中只需添加以下配置

.WillCascadeOnDelete(false);

希望这会有所帮助。