2013-04-03 53 views
0

我是新手到實體框架5.我嘗試在網站中搜索,但有一些類似的問題,但沒有答案。EntityFramework創建一個新的對象並將其添加到其導航屬性

我發佈一條消息對象和具有導航屬性文件

public partial class Announcement 
    { 
     //remove other properties 

     public virtual ICollection<File> Files { get; set; } 
    } 

在SQL Server有公告表,文件表和AnnouncementFiles表 僅具有2個字段[AnnouncementId]和[FILEID]。 Senario是:我創建了一個新的公告,但所有文件已經存在於數據庫中。 代碼是在這裏:

public void CreateAnnouncement(Announcement announcement, List<Guid> fileIds) 
     { 
      using (var db = new MyDbEntities()) 
      { 
       var files = db.Files.Where(f => fileIds.Contains(f.Id)); 
       db.Announcements.Add(announcement); 
       foreach (var file in files) 
       { 
        announcement.Files.Add(file); 
       } 
       db.SaveChanges(); 
      } 
     } 

並沒有錯誤,如(我的.NET框架是不是英語) 無法更新EntitySet的「AnnouncementFiles」,因爲它有一個DefiningQuery,但不具備操作以支持currnet元素。

我不能改變表結構,所以有沒有辦法做到這一點?有的帖子說用方法卻公佈。文件沒有這個方法。 謝謝。

回答

1

您需要在DbContext的OnModelCreating方法中定義鏈接表。

您應該查看使用FluentApi在實體框架中定義多對多關係。代碼看起來像這樣

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Annoucement>() 
    .HasMany(x => x.Files) 
    .WithMany(x => x.Announcements) 
    .Map(x => { 
     x.ToTable("AnnouncementFiles"; 
     x.MapLeftKey("AnnouncementID"); 
     x.MapRightKey("FileID"); 
    }); 
} 

其餘的代碼很好。

+0

我發現這個問題,這是我需要做兩個領域AnnouncementFiles作爲主鍵,我不知道爲什麼,我不改變任何代碼我項目。這是EF5和之前版本之間的區別嗎? – Bubble

相關問題