2017-12-03 202 views
0

我已經使用ef-core創建了多對多的關係,它絕對有效,我能夠在數據庫中創建每個項目並創建關係。但是我這樣做的方式有點冗長。 intellisense中的對象似乎也有錯誤的屬性(我會在下面解釋更多)。我想知道是否有不同的方式。實體框架核心創建多對多關係

這裏是我的實體

DisplayItem.cs

public class DisplayItem 
    { 
     [Key] 
     public int ItemId { get; set; } 
     [Required] 
     public string Description { get; set; } 
     [Required] 
     public string FileType { get; set; } 
     [Required] 
     public string FileName { get; set; } 
     [Required] 
     public byte[] Item { get; set; } 


     public ICollection<LookUpGroupItem> LookUpGroupItems { get; set; } 
    } 

DisplayGroup.cs

public class DisplayGroup 
    { 
     [Key] 
     public int GroupId { get; set; } 
     public string Description { get; set; } 
     [Required] 
     public string Name { get; set; } 

     public ICollection<LookUpGroupItem> LookUpGroupItems { get; set; } 
    } 

關係的實體

LookUpGroupItem.cs

///naming convention will be each entity in the relationship following LookUp 
public class LookUpGroupItem 
    { 
     public int ItemId { get; set; } 
     public DisplayItem DisplayItem { get; set; } 
     public int GroupId { get; set; } 
     public DisplayGroup DisplayGroup { get; set; } 
    } 

假設模型構建邏輯是正確的。 這裏是我用來創建每個然後創建查找關係的代碼。

DisplayLookUpInteraction.cs

public void Create(DisplayGroup g, DisplayItem d) 
    { 
     using (var transaction = _dataContext.Database.BeginTransaction()) 
      try 
      { 
       _dataContext.Add(d); 
       _dataContext.Add(g); 
       _dataContext.SaveChanges(); 
       LookUpGroupItem l = new LookUpGroupItem() { GroupId = g.GroupId, ItemId = d.ItemId }; 
       _dataContext.Add(l); 
       _dataContext.SaveChanges(); 
       transaction.Commit(); 
      } 
      catch (Exception ex) 
      { 

      } 
    } 

這工作得很好,但同樣它似乎有點多。而現在,每當我使用DisplayItemDisplayGroup時,對象內總是有ICollection<LookUpGroupItem>的屬性。這個是來做什麼的?

回答

1

你可以簡單地做這樣的:

try 
{ 
    LookUpGroupItem l = new LookUpGroupItem 
    { 
     DisplayGroup = g, 
     DisplayItem = d 
    }; 
    _dataContext.Add(l); 
    _dataContext.SaveChanges(); 
} 
catch (Exception ex) 
{ 
    // handle the error 
} 

當成功執行SaveChanges方法則ItemIdGroupId屬性將與EF爲你正確的值進行配置。

您不需要交易,因爲如果遇到錯誤,單個SaveChanges調用將自動觸發一個事務,該事務將回滾所有修改。

+0

我刪除了我的評論,並提出了另一個問題@CodeNotFound –