我对EF非常不熟悉,而且我一直在努力解决我相信是相当平凡的问题。 我有两个表,SpecialCondition和SpecialConditionDepartment。特殊条件可以应用于多个部门,因此在SpecialConditionDepartment表中我存储了conditionID和deparmentID。如果条件适用于两个部门,则SpecialConditionDepartment表中将有两行具有相同的conditionID。当更新存储库中的现有对象时,EF'无法在对象中插入重复键'
public class SpecialCondition
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<SpecialConditionDepartment> Departments { get; set; }
}
public class SpecialConditionDepartment
{
private SpecialConditionDepartment()
{
}
public SpecialConditionDepartment(int conditionID, int departmentID)
{
ConditionID = conditionID;
DepartmentID = departmentID;
}
public int ConditionID { get; set; }
public int DepartmentID { get; set; }
}
var specialCondition =modelBuilder.Entity<SpecialCondition>().ToTable("SpecialCondition");
specialCondition.HasMany(o => o.Departments)
.WithOptional()
.HasForeignKey(c => c.ConditionID);
modelBuilder.Entity<SpecialConditionDepartment>().ToTable("SpecialConditionDepartment")
.HasKey(c => new { c.ConditionID, c.DepartmentID });
最后,Web服务中的更新方法非常简单。我抓住从DB对象,更新名称和部门列表,然后使用通用库更新()更新:
public SpecialConditionDto UpdateCondition(SpecialConditionDto dto)
{
SpecialCondition specialcondition = specialConditionRepository.GetById(dto.ID);
specialcondition.Name = dto.Name;
specialcondition.Departments =
mapper.Map<ICollection<SpecialConditionDepartmentDto>, ICollection<SpecialConditionDepartment>>(
dto.Departments);
specialConditionRepository.Update(specialcondition);
unitOfWork.Commit();
return specialcondition.Map<SpecialConditionDto>();
}
的SpecialConditionRepository从RepositoryBase,这反过来从IRepository
public class SpecialConditionRepository : RepositoryBase<SpecialCondition>, ISpecialConditionRepository
public abstract class RepositoryBase<T> : IRepository<T> where T : class
继承继承
和知识库的基础,所有的通用添加,GetById,更新等被定义
public abstract class RepositoryBase<T> : IRepository<T> where T : class
{
protected IDbSet<T> Set
{
get { return Context.Set<T>(); }
}
protected RepositoryBase()
{
DatabaseFactory = new DatabaseFactory();
}
private EFContext _context;
public EFContext Context
{
get { return _context ?? (Context = DatabaseFactory.Create()); }
set { _context = value; }
}
}
在上下文是模型和ID篮网已定义
public IDbSet<SpecialCondition> SpecialConditions { get; set; }
public IDbSet<SpecialConditionDepartment> SpecialConditionDepartments { get; set; }
相同的代码适用于创建特殊条件。当尝试更新时,它不明白我希望它更新部门,它会尝试向SpecialConditionDepartment表中添加新行,最终导致我的代码崩溃。
我缺少什么?
您错过了'GetById'返回的部分。我的头顶是我的猜测是你的'DepartmentId'没有被填充。这引发了一个插入程序。这与已经存在的独特约束相冲突。我只是设置一个断点,并观察对象的“特殊条件”具有适当的属性。 – djangojazz
为清晰起见进行了编辑。我从数据库中获取对象,然后更新名称和Departments列表。部门清单上的值(ConditionID和DepartmentID)是有效的。问题是,当我更新适用于部门6的ID 13的条件时,它会尝试将行ConditionID = 13 DepartmentID 6添加到SpecialConditionDepartment表中,但它不明白该行已经存在于此之前 – Ritx
好吧,我已关闭不管怎么说,我在看你的桌子下面的物品时,我所说的关键。您是直接从您的repo类显示的代码?因为什么是'specialConditionRepository'对象?通常在EF中,你会像(var context = new MyEFContext())那样创建一个“上下文”,然后在那里工作。您将更新和提交混合为两个不同的对象。但是你说它适用于插入,所以我很好奇,因为它可能没有被提交,但第一次插入时出现,然后在第二次插入时出现。 – djangojazz