实体框架核心创建多对多关系

时间:2017-12-03 06:01:38

标签: c# entity-framework asp.net-core entity-framework-core

我使用ef-core创建了多对多的关系,它确实有效,我能够在数据库中创建每个项目,并创建一个关系。但我这样做的方式有点冗长。智能感知中的对象似乎也有错误的属性(我将在下面解释)。我想知道是否有不同的方式。

这是我的实体

  

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 个答案:

答案 0 :(得分:1)

你可以这样做:

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

成功执行SaveChanges方法后,EF将为您配置ItemIdGroupId属性以及正确的值。

您不需要事务,因为单个SaveChanges调用将自动触发一个事务,如果遇到错误,该事务将回滚所有修改。

相关问题