ef6在保存时仅设置导航属性的外键属性

时间:2017-03-22 01:11:43

标签: entity-framework entity-framework-6

当我保存具有我用作外键的导航属性的实体时:

this.HasRequired<Role>(c => c.Role).WithMany().Map(c => c.MapKey("role_id"));

我只设置了这个导航属性的外键属性(我从网页上获取),因此这个导航属性的其他属性是空的,但是它们有所需的限制:

this.Property(c => c.RoleName).IsRequired();

这就是我得到&#34; dbentityvalidationexception&#34; 例外的原因,错误&#34;字段是必需的&#34; 。< / p>

有可能通过某种方式解决这个问题吗? 或者我必须从DB获取该导航属性的完整实体,设置我保存的实体的导航属性,然后保存我的初始实体(现在可以使用,但它看起来不是很好的解决方案)?

提前致谢。

这是我处理模型的MS MVC操作:

    [HttpPost]
    public async Task<ActionResult> AddAsync(Staff staff)
    {
        await staffService.InsertAsync(staff);
        return RedirectToAction("Index");
    }

以及我设置属性的那部分视图:

    <dt>
        @Html.Label("Role")
    </dt>
    <dd>
        @Html.DropDownListFor(_=>_.Role.Id, new SelectList(ViewBag.Roles, "Id", "RoleName"), "- Please select a Role -")
    </dd>

这是模型的类型&#34;员工&#34;

public class Staff
{
    public Staff()
    {
        Name = new Name();
    }

    public int Id { get; set; }
    public Name Name { get; set; }
    ...
    public virtual Role Role { get; set; }
    ...
}

1 个答案:

答案 0 :(得分:0)

我找到了或多或少的解决方案。 我已经设置了所有导航属性,我只有外键属性 EntityState.Unchanged。

现在我有这种方法只保存特定实体(Staff)

    public virtual Staff InsertStaff(Staff entity)
    {
        context.Entry(entity.Role).State = EntityState.Unchanged;
        context.Entry(entity.Maneger).State = EntityState.Unchanged;
        SetStaffNavigationPropertiesUnchanged(entity);
        return dbSet.Add(entity);
    }

这用于保存完整图表(在基础通用类中):

    public virtual TEntity InsertGraph(TEntity entity)
    {
        return dbSet.Add(entity);
    }

使用“EntityState.Unchanged”(我将以最简单的方式显示)让我在角色只填充外键属性时保存工作人员(角色具有RoleName必需属性)

        using (ClinchContext context = new ClinchContext())
        {
            var role = new Role { Id = 1 };

            Staff staff = context.Staffs.Add(new Staff
            {
                Name = new Name { Firstname = "FN", Surname = "S", Patronymic = "P" },
                Email = "E",
                Login = "L",
                IsDeleted = false,
                Role = role,
                Maneger = null//nullable for now
            });

            context.Entry(staff.Role).State = EntityState.Unchanged;
            context.SaveChanges();
        }

如果有人有更合适的解决方案,我很乐意知道,谢谢。