5

我有一个数据库模型,其中模型之间存在关系,这给 Code First 带来了一些问题。下面是一个构造的例子。

一个读者可以读过几本书,而一本书可以被几个读者读过。此外,每个读者可能都有一本最喜欢的书。

//not-working model
public class BookReader
{
    public virtual List<Book> ReadBooks { get; set; }
    public virtual Book FavoriteBook { get; set; }
    public int ID { get; set; }
}

public class Book
{
    public string BookName { get; set; }
    public int ID { get; set; }
}

这不是很好。如果在代码中,多个读者被设置为阅读同一本书,则只有一个读者会将其保存到数据库(可能是最后一组)。

此外,如果 BookReader.FavoriteBook 和 BookReader.ReadBooks 包含同一本书并且 db.SaveChanges() 创建这本新书(不是现有的数据库实体),它将导致此错误:
保存不公开外键的实体时发生错误他们关系的属性。

这是我对 InverseProperty 和导航属性的修复。

//working model
public class BookReader
{
    [InverseProperty("CurrentReaders")]
    public virtual List<Book> ReadBooks { get; set; }
    public virtual Book FavoriteBook { get; set; }

    public int ID { get; set; }
}

public class Book
{
    public string BookName { get; set; }
    public int ID { get; set; }
    //new, unwanted, property
    public virtual List<BookReader> CurrentReaders { get; set; }
}


我不想像这样改变模型。有没有一种方法可以在不更改模型的情况下使用 Fluent API 完成?

我之前发布了一个类似的问题,但删除了它,因为这个问题与问题无关

4

1 回答 1

4

用于WithMany()在 Book 实体中配置没有导航属性的多对多关系:

modelBuilder.Entity<BookReader>()
    .HasMany(r => r.ReadBooks)
    .WithMany();

这将创建联结表BookReaderBooks和作为BookReader_IDBook_ID键。您还可以为表和键指定自己的漂亮名称:

.WithMany().Map(mc => mc.MapLeftKey("ReaderId").MapRightKey("BookId"));
于 2013-08-07T09:44:18.527 回答