1

我喜欢 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 一起正常工作。

在 Entity Framework 4.1 code first ,Entity Framework 4.1 InverseProperty Attribute 和 ForeignKey中存在多个指向同一个表的问题,以及其他类似的问题,但这些问题往往涉及两端的集合。

我的模型可能是错误的,因为很早就开始感到沮丧,我想如何在 SQL 中做到这一点:

Book
    Id
    Name
    // other properties

Recommendation
    Id
    BookId
    RecommendedBookId
    // other properties

Book.Id : Recommendation.BookId然后在和之间会有外键Book.Id : Recommendation.RecommendedBookId

我需要通过数据注释或流畅的 API 做什么才能使其正常工作,或者我应该如何修改我的模型?

4

2 回答 2

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 实体和一个 Recommendations 集合。这意味着一本书可以有很多推荐,而推荐只属于一本书。当一本书被创建,然后你尝试为它写推荐信时,你会看到有一个下拉框,通过它的“BookID”来显示这本书的名字。

于 2012-07-17T08:10:15.083 回答
0

好问题。抱歉,我花了一年时间才找到这个。

您需要告诉 EF 您与 Book 的 2 个关系中的哪一个是 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 将 BookRecommended 属性命名为 BookRecommendation 上的属性,因此 EF 清楚地知道该 FK 指的是 2 个 FK 中的哪一个。为了更好地衡量,2 ForeignKey 属性可以显式命名 BookRecommendation 上的 FK 属性 - 如果需要,您可以摆脱额外的属性,但如果您保留它们,则该属性必须存在。

于 2013-03-30T08:50:29.573 回答