【问题标题】:What's wrong with this mapping?这个映射有什么问题?
【发布时间】:2011-10-18 22:13:54
【问题描述】:

我想根据下面的类字典创建下表。添加记录时出现异常。这个映射有什么问题?如果我将“B”类的子属性指向另一个类(例如“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 约束。 无法创建约束。查看以前的错误。

谢谢,

阿什拉夫

【问题讨论】:

  • 我看不出这个映射有什么问题。您能否提供有关引发异常的代码的外观以及异常消息究竟是什么的信息?
  • @Slauma 和 Ladislav,更新了错误信息

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


【解决方案1】:

阅读以下帖子后,我找到了解决方案。 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”类中引用了两次。代码首先尝试为“B”类中的父列和子列打开级联删除,这会导致异常。

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

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

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

【讨论】:

  • 啊,很好的发现! CascadeOnDelete 确实没有属性。只能在 Fluent API 中进行配置。
【解决方案2】:

此异常是特定于 SQL 服务器的。如果您关闭关系的级联,它将消失。默认情况下,Ef 将为您打开它。您可以通过 fluent api 执行此操作。 在关系中只需添加以下配置

.WillCascadeOnDelete(false);

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 2011-04-16
  • 2012-12-28
  • 2014-08-22
  • 1970-01-01
  • 2011-04-10
  • 2015-10-17
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多