【问题标题】:EF 4.1 Code First - Self-referencing foreign keys and Foreign key to other tablesEF 4.1 Code First - 自引用外键和其他表的外键
【发布时间】:2011-06-24 11:13:06
【问题描述】:

我有一个POCO类如下

public class Category 
{ 
   public int ID {get; set; }
   public string desc {get; set; }
   public int parentID {et; set; }
}

public class Issue 
{
   public int ID {get; set;}
   ....
   public int categoryID {get; set; }
   public int subCategoryID {get; set; }

   public virtual Category category{get; set; }
   public virtual Category subCategory {get; set;}
}

我不断收到上述类的外键错误。基本上,我的类别表包含带有子类别的类别。一个问题可以有一个类别和子类别。有人会指导我以正确的方式定义这种关系吗?我尝试使用外键注释,但它给了我一个错误,说数据库已创建,但由于问题上指定的外键关系,对象创建失败。任何想法为什么?我能做些什么来解决这个问题?

【问题讨论】:

  • 如果出现问题,子类别是什么意思 - 类别和子类别属性如何相关?例如,如果我们为问题设置了一些子类别 - 类别属性必须有其父集?
  • 基本上一个问题可以有一个类别和一个子类别。这由 Category 类表示(或应该是)。如果一个对象填充了 parentId,则意味着该对象表示一个子类别,并且它指向的 parentId 是类别。希望这是有道理的。

标签: entity-framework foreign-keys entity-framework-4.1


【解决方案1】:

请看这篇文章-How to Configure a Self Referencing Entity in Code First

我相信这将帮助您正确设置关系。正如您将在文章中看到的,您需要在 DbContext 类的 OnModelCreating 方法中定义一些额外的流畅设置。

【讨论】:

  • Fluent API 是否只需要自引用约束,还是需要为所有外键添加它?谢谢
  • 我相信您只需要它用于自引用约束或超出标准 EF Code First 约定的其他条件。典型的外键将自动配置,无需在 OnModelCreating 方法中添加额外的条件。
  • 根据文章,我改变了我的类,像这样 public class Category { public int ID {get;放; } 公共字符串 desc {get;放; } 公共整数?父ID {获取;放; } 公共虚拟类别 parentCategory {get; set;} 公共虚拟 ICollection 问题 {get;放;在我的 OnModelCreating() 中,我放入了 modelBuilder.Entity().HasOptional(c => c.parentCategory).WithMany().HasForeignKey(s => s.parentID); modelBuilder.Entity().HasRequired(i => i.category).WithMany().HasForeignKey(c => c.categoryId);但我收到“无法确定主要结束...”错误
  • 这是整个错误 - 无法确定“Helpdesk.Domain.Entities.Category_parentCategory”关系的主体端。多个添加的实体可能具有相同的主键
  • 我基于此创建了一个示例控制台应用程序,它对我有用。请参阅此要点 - gist.github.com/1045067 获取代码,看看这是否是您要完成的任务..
【解决方案2】:

你可以用一个类来做到这一点。

对于 EF4.1 代码,我有以下示例:

/// <summary>
/// represents a single configuration item within CM
/// </summary>
public class CI
{
    [Key]
    public int ID { get; set; }

    ....

    [ForeignKey("Parent")]
    public int? Parent_ID { get; set; }




    [InverseProperty("Parent")]
    [ForeignKey("Parent_ID")]
    public virtual ICollection<CI> Contents { get; set; }


    [InverseProperty("Contents")]
    public virtual CI Parent { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多