2013-08-07 37 views
4

我有一個數據庫模型,其中模型之間的關係給Code First帶來一些問題。下面是一個構建的例子。使用流利的API而不是InverseProperty和導航屬性

一位讀者可以讀幾本書,一本書可以被幾位讀者閱讀。另外,每個讀者可能有一本最喜歡的書。

//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

使用WithMany()配置多對多的關係,而不導航屬性:

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

這將創建聯結表BookReaderBooksBookReader_IDBook_ID作爲主鍵。你也可以指定你自己漂亮的表格和鍵名稱:

.WithMany().Map(mc => mc.MapLeftKey("ReaderId").MapRightKey("BookId")); 
+1

工作完美,如此簡潔....謝謝! – Jens