EF查找项目已存在时添加

时间:2017-01-16 21:59:35

标签: asp.net-mvc entity-framework

我非常确定这不是一个重复的问题(或者我不知道如何正确地提出这个问题)所以这里就是这样。我有一个使用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实体就是我一直称之为查找的。

当我在客户端上发生更新后尝试保存实体时出现问题。我的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");
        });

0 个答案:

没有答案