2

我真的需要有人幫助我充分理解如何與實體框架4 CTP 5,POCO進行多對多的關係。我需要了解3個概念:實體框架4 CTP 5 POCO - 多對多的配置,插入和更新?

  1. 如何將我的模型配置爲表示 某些表是多對多的。
  2. 如何正確插入。
  3. 如何正確地進行更新。

這裏是我當前型號:

public class MusicSheet 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Key { get; set; } 

    public virtual ICollection<Author> Authors { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

public class Author 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Bio { get; set; } 

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

public class Tag 
{ 
    [Key] 
    public int ID { get; set; } 
    public string TagName { get; set; } 

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

正如你所看到的,MusicSheet可以有很多AuthorsTagsAuthorTag可以有多個​​。

同樣,我的問題是:

  1. 做什麼的 EntityTypeConfiguration設置 映射它們之間的 關係,以及一個表/對象 與帶許多一對多 的關係。
  2. 如何插入新的樂譜 (它可能有多個 作者或多個標籤)。
  3. 如何更新樂譜。對於 例如,我可以設置TAGATAGB到MusicSheet1,但後來我必須將代碼更改爲塔加湘火炬。好像我需要 先檢查,看看標籤 已經存在,如果沒有,插入 新的標籤,然後將其與 關聯的樂譜(所以我不 重新插入TAGA? )。或者這是 東西已經由 框架處理?

非常感謝。我真的很希望完全理解它,而不是完全理解發生了什麼。特別是在#3。

回答

5
  1. 在EF4 CTP5的關係是默認慣例,當你把公共虛擬ICollection的每個多對多關係類的做,因爲你已經做了,你的上下文類應該看像這樣:

    public class YourContextName : DbContext 
    { 
        public DbSet<MusicSheet> MusicSheets { get; set; } 
        public DbSet<Tag> Tags { get; set; } 
        public DbSet<Author> Authors { get; set; } 
    } 
    
  2. 很簡單,你只需要創建MusicSheet類的實例,然後你的作家和標籤的所有實例添加到每個在你MusicSheet作者和標籤的集合,然後添加你的將MusicSheet的實例添加到您的控件中MusicSheets的分機集合,然後調用的SaveChanges:

     MusicSheet musicSheet = new MusicSheet 
               { 
                Title = "Music Sheet 1", 
                Key = "Key", 
                Authors = new List<Author> 
                    { 
                     new Author 
                      { 
                       Name = "Author 1", 
                       Bio = "Author 1 biographic text..." 
                      }, 
                     new Author 
                      { 
                       Name = "Author 2", 
                       Bio = "Author 2 biographic text..." 
                      } 
                    }, 
    
                Tags = new List<Tag> 
                   { 
                    new Tag {TagName = "TagA"}, 
                    new Tag {TagName = "TagC"} 
                   } 
               }; 
    
    
        var context = new YourContextName(); 
        context.MusicSheets.Add(musicSheet); 
        context.SaveChanges(); 
    
  3. 要更新,你必須加載MusicSheet並刪除你不想要的標籤,然後添加你需要添加的,這是怎麼了:

    var context = new YourContextName(); 
        var myMusicSheet = context.MusicSheets.First(); 
    
        //The Tag you wnat to remove. 
        var tagToRemove = myMusicSheet.Tags.First(); 
    
        var tagToAdd = new Tag {TagName = "TagX"}; 
    
        myMusicSheet.Tags.Remove(tagToRemove); 
        myMusicSheet.Tags.Add(tagToAdd); 
    
        context.Entry(myMusicSheet).State = EntityState.Modified; 
        context.SaveChanges(); 
    

您還可以找到任何作者和/或標記,你知道存在,並添加到您的MusicSheet,反之亦然,但這是基礎。

記住,這是爲EF4 CTP5守則第一...

對不起我的英語不是我的主要語言,我希望這可以幫助你,從多米尼加共和國最誠摯的問候。

PS:不要忘了添加的EntityFramework和System.Data.Entity的引用,是你的責任做任何事情都要像單元測試,驗證,異常處理...等

編輯:

首先,你需要一個構造函數添加到您的機型:

public class Tag 
{ 
    [Key] 
    public int ID { get; set; } 
    public string TagName { get; set; } 

    public Tag() 
    { 
     MusicSheets = new List<MusicSheet>(); 
    }   

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

......然後,你可以做這樣的事情:

var context = new YourContextName(); 
var newMusicSheet = new MusicSheet(); 
    newMusicSheet.Title = "Newly added Music Sheet"; 

//Your existing Tag. 
var existingTag = contex.Tags.Find(3);   

existingTag.MusicSheets.Add(existingTag); 

context.Entry(existingTag).State = EntityState.Modified; 
context.SaveChanges(); 

您可以對所有型號都做同樣的事情。

我希望這能幫助你!

+0

非常感謝,我得到了#1&#2回答並理解:)在我的更新問題上:我需要找到現有的標籤/作者並在添加新標籤之前將其刪除?我不能只向他們提供任何標籤/作者和框架,只是出去並更新自己?只要確保:)再次感謝。 – Saxman 2011-02-14 16:41:09

0

您並不需要EntityTypeConfiguration來設置它們之間的關係。它應該像現在一樣工作。使用CTP5,您需要做的建立多對多關係的方法是在兩個實體中都包含ICollection。

現在介紹如何執行插入和刪除操作,我知道有兩種方法。我通常使用的是爲多對多關係的結果表創建一個實體,然後創建該實體的實例併爲其提供所需的所有數據,包括其他實體的實例(那些實例有多對多的關係)。最後,我只需將其添加到存儲庫並提交事務(通常使用UnitOfWork類)。

簡單的例子:

public class Item 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<Bid> Bids { get; set; } 
} 

public class User 
{ 
    public int ID { get; set; } 
    public string Username{ get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public virtual ICollection<Bid> Bids { get; set; } 
} 

public class Bid 
{ 
    public int ID { get; set; } 
    public float Amount { get; set; } 
    public DateTime Date { get; set; } 
    public virtual Item Item { get; set; } 
    public virtual User User { get; set; } 
} 

那我就簡單地創建投標實體的實例。

public void PlaceBid(User user, Item item, int amount) 
{ 
    if (ValidateBid(amount, user, item)) 
    { 
     Bid bid = new Bid 
     { 
      Amount = amount, 
      Date = DateTime.Now, 
      User = user, 
      Item = item 
     }; 

     try 
     { 
      repository.Add(bid); 
      unitOfWork.Commit(); 
     } 
     catch (Exception ex) 
     { 
      //TODO: Log the exception 
      throw; 
     } 
    } 
}