LINQ / Code优先:如何从父对象中删除子对象的引用?

时间:2015-08-11 20:57:02

标签: c# linq cascade

我有' UserProfile'和'执行'使用Repository模式的1:1关系上的对象。 UserProfiles是系统的必需/部分,管理人员基于UserProfiles。

这是我的UserProfile :(相关部分)

public int? ExecutiveId { get; set; }
[ForeignKey("ExecutiveId")]
public virtual Executive Executive { get; set; }

这是我的执行官:(相关部分)

public int UserProfileId { get; set; }
[ForeignKey("UserProfileId")]
public virtual UserProfile UserProfile { get; set; }

这是我的FluentApi :(因为执行是可选的,需要UserProfile)

modelBuilder.Entity<Executive>()
            .HasRequired(x => x.UserProfile)
            .WithOptional(s => s.Executive)
            .WillCascadeOnDelete(false); <-- I've tried 'true' here as well

现在当我尝试删除它,并查看SQL Mgr时,我看到我删除的特定执行者的UserProfile仍然是一个整数,而不是我所期望的NULL ...这是我的代码删除:

 var executive = _executiveRepository.GetExecutiveById(id);
        // remove pic/content
        _contentRepository.DeleteContent(executive.ProfilePictureContent.ContentGuid);
        // remove mappings
        _executiveSectionMappingRepository.DeleteExecutiveSectionMappingRange(executive.ExecutiveSectionMappings);
        // remove executive
        _executiveRepository.DeleteExecutive(id);
        // remove reference from User also as EF isn't doing this the way it's setup now.
        var u = _userRepository
            .GetUserProfiles()
            .FirstOrDefault(x => x.ExecutiveId == executive.UserProfileId);
        if (u != null)
        {
            u.ExecutiveId = null;<-- these don't work !!
            u.Executive = null;  <-- not working
        }
        // save
        _contentRepository.Save();
        _executiveSectionMappingRepository.Save();
        _executiveRepository.Save();
        _userRepository.Save();

我错过了什么?enter image description here

1 个答案:

答案 0 :(得分:2)

我没有先使用Code,但它看起来像是在保存您的存储库,而不是设置要修改的实体。

这意味着您在内存中更新了userProfile的对象,但没有将您的repo设置为使用该对象。 {除非我错误地使用Code First},但似乎你需要做一些事情:

_userRepository.UpdateExistingUser(u);

然后调用_userRepository.Save();