【发布时间】:2018-08-20 04:05:18
【问题描述】:
我目前正在学习通过在新的 MVC 应用程序中使用实体框架来使用它。我在 2 个表之间建立多对多关系时遇到了一些困难,但它可以用于显示数据。但是,更新实体时,EF 会为链接表插入重复记录。
BusinessUnit 表示一个实体,该实体将 WindowsLogins 和 WindowsGroups 组合在一起以通过业务单元使用。 BusinessUnitWindowsLogin 和 BusinessUnitWindowsGroup 用作多对多关系的连接表。
实体在 C# 中定义如下:
业务单位
public class BusinessUnit
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public bool IsPersonal { get; set; }
public virtual IList<WindowsGroup> WindowsGroups { get; set; }
public virtual IList<WindowsLogin> WindowsLogins { get; set; }
}
WindowsGroup(WindowsLogin 类似)
public class WindowsGroup
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Domain { get; set; }
public string Name { get; set; }
public ICollection<BusinessUnit> BusinessUnits { get; set; }
}
我在我的 DbContext 的 OnModelCreating 方法中写了这个来注册联结表和外键:
modelBuilder.Entity<BusinessUnit>()
.HasMany(businessUnit => businessUnit.WindowsGroups)
.WithMany(windowsGroup => windowsGroup.BusinessUnits)
.Map(mc =>
{
mc.MapLeftKey("BusinessUnitId");
mc.MapRightKey("WindowsGroupId");
mc.ToTable("BusinessUnitWindowsGroup", "Config");
});
modelBuilder.Entity<BusinessUnit>()
.HasMany(businessUnit => businessUnit.WindowsLogins)
.WithMany(windowsLogin => windowsLogin.BusinessUnits)
.Map(mc =>
{
mc.MapLeftKey("BusinessUnitId");
mc.MapRightKey("WindowsLoginId");
mc.ToTable("BusinessUnitWindowsLogin", "Config");
});
我的更新是这样写的:
public void Update(BusinessUnit businessUnit)
{
var oldBusinessUnit = _unitOfWork.BusinessUnits.GetById(businessUnit.Id);
oldBusinessUnit.Name = businessUnit.Name;
oldBusinessUnit.WindowsGroups.Clear();
oldBusinessUnit.WindowsLogins.Clear();
oldBusinessUnit.WindowsGroups = businessUnit.WindowsGroups;
oldBusinessUnit.WindowsLogins = businessUnit.WindowsLogins;
_unitOfWork.Complete();
}
我必须清除 WindowsGroups 和 WindowsLogins 列表才能正确更新联结表,现在可以正常工作了。但是,一旦我分配了新的 WindowsGroups 或 WindowsLogins 列表,Entity Framework 就会插入重复的 WindowsGroups 或 WindowsLogins。联结表使用新的 Id 更新,因此它在应用程序中看起来正确,但在数据库中是错误的。
我愿意接受任何建议和反馈。提前谢谢!
【问题讨论】:
标签: c# asp.net-mvc entity-framework many-to-many