实体框架代码首先有一个类有两个引用另一个

时间:2012-05-12 19:35:31

标签: ef-code-first

我喜欢EF Code First,但有时似乎在SQL中定义表会更容易。

在这种情况下,我有两个模型,如下所示:

public class Book
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<BookRecommendation> BookRecommendations { get; set; }
    // additional properties about the item
}

public class BookRecommendation
{
    public int Id { get; set; }
    // public int BookId { get; set; } // from attempts to use data annotations
    public virtual Book Book { get; set; }
    // public int BookRecommendedId { get; set; } // from attempts to use data annotations
    public virtual Book BookRecommended { get; set; }
    // additional properties about the relationship between the two items
}

不幸的是,我无法使用数据注释或流畅的API来正常工作。

Multiple foreign keys pointing to same table in Entity Framework 4.1 code firstEntity Framework 4.1 InverseProperty Attribute and ForeignKey以及其他类似的问题,但这些问题往往涉及到两端的集合。

我的模型可能是错的,因为很早就设置了挫折感,我想到了我在SQL中如何做到这一点:

Book
    Id
    Name
    // other properties

Recommendation
    Id
    BookId
    RecommendedBookId
    // other properties

Book.Id : Recommendation.BookIdBook.Id : Recommendation.RecommendedBookId之间会有外键。

我需要通过数据注释或流畅的API来完成这项工作,或者我应该如何修改我的模型?

2 个答案:

答案 0 :(得分:0)

public class Book
{
    public int BookID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<BookRecommendation> BookRecommendations { get; set; }

}

public class BookRecommendation
{
    public int BookRecommendationID { get; set; }
    public int BookID { get; set; } 
    public string remarks { get; set; } //Some recommendation text

    public virtual Book Book { get; set; }

}

我想这应该可以解决问题!它将为它创建一个Book实体和一系列建议书。这意味着一本书可以有很多推荐,而推荐只属于一本书。当一本书被创建然后你试图为它写推荐时,你会看到有一个下拉框,其中包含通过其“BookID”书籍的书名。

答案 1 :(得分:0)

好问题。对不起,我花了一年才找到这个。

你需要告诉EF你的两个关系中哪一个回到Book是BookRecommendation使用InversePropertyAttribute指向的那个。在代码中:

public class Book
{
    public int Id { get; set; }
    public string Name { get; set; }

    [InverseProperty("BookRecommended")]
    public virtual ICollection<BookRecommendation> BookRecommendations { get; set; }
    // additional properties about the item
}

public class BookRecommendation
{
    public int Id { get; set; }

    [ForeignKey("Book")]
    public int BookId { get; set; }
    public virtual Book Book { get; set; }

    [ForeignKey("BookRecommended")]
    public int BookRecommendedId { get; set; }
    public virtual Book BookRecommended { get; set; }
}

因此,Book上的InverseProperty在BookRecommendation上命名BookRecommended属性,因此EF清楚地知道了这一个引用的2个FK中的哪一个。为了更好地衡量,2个ForeignKey属性只是可以在BookRecommendation上明确命名FK属性 - 如果需要,你可以删除额外的属性,但是如果保留它们,属性必须存在。