2017-12-03 222 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 –