我使用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)
{
}
}
这很好用,但似乎有点多了。现在,每当我使用DisplayItem
或DisplayGroup
时,对象中的ICollection<LookUpGroupItem>
始终都有一个属性。这是为了什么?
答案 0 :(得分:1)
你可以这样做:
try
{
LookUpGroupItem l = new LookUpGroupItem
{
DisplayGroup = g,
DisplayItem = d
};
_dataContext.Add(l);
_dataContext.SaveChanges();
}
catch (Exception ex)
{
// handle the error
}
成功执行SaveChanges
方法后,EF将为您配置ItemId
和GroupId
属性以及正确的值。
您不需要事务,因为单个SaveChanges
调用将自动触发一个事务,如果遇到错误,该事务将回滚所有修改。