我非常确定这不是一个重复的问题(或者我不知道如何正确地提出这个问题)所以这里就是这样。我有一个使用EF 6.1的ASP.NET MVC项目。在其中我有一个名为Member的实体。会员有一个名为Races的属性,可以包含一个或多个Race实体。会员的Races属性:
public virtual ICollection<Race> Races { get; set; }
种族实体:
public class Race : ILookupListItem {
public int Id { get; set; }
public string Description { get; set; }
public bool Active { get; set; }
[JsonIgnore]
public virtual ICollection<Member> Members { get; set; }
}
Race实体就是我一直称之为查找的。 p>
当我在客户端上发生更新后尝试保存实体时出现问题。我的SaveMember控制器方法与我的业务逻辑方法一起用于实际保存实体。 (为了避免混淆,InjectFrom是ValueInjecter方法,JSONResponseError和JSONResponseSuccess类是我们围绕JsonResult的自定义包装器。)
public JsonResult SaveMemberInfo(MemberInfoModel model) {
try {
// retrieve member
var member = new Member();
member.InjectFrom(model);
var races = new List<Race>();
races.InjectFromList(model.Races);
member.Races = races;
// save member
var savedMember = _members.UpdateMember(member, out errId);
var savedModel = GetMemberChartViewModel(savedMember);
// notify user of success
return new JsonResponseSuccess(savedModel);
}
catch (Exception ex) {
return new JsonResponseError(message);
}
}
_members.UpdateMember方法如下。
public Member UpdateMember(Member contract, out int? errId) {
try {
using (_db = new ApplicationContext(_currentUserID)) {
// updates entity state in the context using the entity's State field from Julie Lerman's example on MSDN.
_db.FixState();
_db.SaveChanges();
errId = null;
return contract;
}
}
catch (Exception ex)
{
// log error to db and return id
errId = LogError(ex, "MemberLogic.UpdateMember");
return null;
}
}
当我从UpdateMember方法返回数据合约时,Races属性在更新之前将所有比赛保存到memeber,加上我刚刚保存的任何比赛(所以它添加但不做差异确定哪些项目已经存在,哪些项目已被删除)。此外,Races表现在将具有&#34; new&#34;的重复条目。比赛。我的假设是,这不是EF的默认行为,但我从未使用填充项目列表的下拉列表,通常它只是一个属性(如性别或国家)。我有什么明显的遗失吗?
谢谢!
编辑:我刚刚想到,会员和竞赛交叉表的EntityConfiguration会很有用,下面补充说。显然,这只是我认为与问题相关的部分。
HasMany(t => t.Races).WithMany(t => t.Members).Map(m =>
{
m.ToTable("MemberRaces", "dbo");
m.MapLeftKey("MemberId");
m.MapRightKey("RaceId");
});