我喜欢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 first,Entity Framework 4.1 InverseProperty Attribute and ForeignKey以及其他类似的问题,但这些问题往往涉及到两端的集合。
我的模型可能是错的,因为很早就设置了挫折感,我想到了我在SQL中如何做到这一点:
Book
Id
Name
// other properties
Recommendation
Id
BookId
RecommendedBookId
// other properties
Book.Id : Recommendation.BookId
和Book.Id : Recommendation.RecommendedBookId
之间会有外键。
我需要通过数据注释或流畅的API来完成这项工作,或者我应该如何修改我的模型?
答案 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属性 - 如果需要,你可以删除额外的属性,但是如果保留它们,属性必须存在。