2011-06-24 36 views
2

我有一个POCO类,如下所示EF 4.1代码第一次 - 自我参照的外键和外键,其他表

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

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

+0

拿什么发行的情况下,子类 - 以及如何分类和子类的属性有关系吗?例如,如果我们有一些子类别设置的问题 - 类别属性必须有其父设置? – DanNsk

+0

基本上,一个问题可能有一个类别和一个子类别。这是由Category类表示(或应该是)。如果一个对象具有parentId填充,这意味着该对象表示一个子类别,它指向的parentId是Category。希望这是有道理的。 – SimpleUser

回答

4

请参见本文 - How to Configure a Self Referencing Entity in Code First

我相信,这将有助于你建立关系的正确。正如你将在文章中看到的,你需要在DbContext类的OnModelCreating方法中定义一些附加流畅设置。

+0

Fluent API只需要自引用约束,还是需要为所有外键添加它?谢谢 – SimpleUser

+0

我相信你只需要它自我引用的约束或其他超出标准EF Code First惯例的条件。典型的外键将自动配置,而无需在OnModelCreating方法中添加附加条件。 –

+0

根据文章,我改变了我的类像这样public class Category {public int ID {get;组; } public string desc {get;组; } public int? parentId {get;组; } public virtual category parentCategory {get;设置;}公共虚拟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); 但是我得到'无法确定主体端...'错误 – SimpleUser

1

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

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