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

Entity framework ef6保存时仅设置导航属性的外键属性,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,保存具有用作外键的导航属性的实体时: this.HasRequired<Role>(c => c.Role).WithMany().Map(c => c.MapKey("role_id")); 这就是为什么我得到“dbentityvalidationexception”异常并出现错误的原因。“字段是必需的” 有可能用某种方法解决这个问题吗? 或者我必须从DB中获取该导航属性的完整实体,设置我保存的实体的导航属性,然后保存我的初始实体(它现在可以工作,但看起来不是一个好的

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

this.HasRequired<Role>(c => c.Role).WithMany().Map(c => c.MapKey("role_id"));
这就是为什么我得到“dbentityvalidationexception”异常并出现错误的原因。“字段是必需的”

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

提前谢谢

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

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

我或多或少找到了解决那个问题的好办法。 我已将只有外键属性的所有导航属性设置为 EntityState.Unchanged

现在我有了这个只保存特定实体(人员)的方法

这用于保存完整图形(在基本泛型类中):

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


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

我或多或少找到了解决这个问题的好办法。 我已将只有外键属性的所有导航属性设置为 EntityState.Unchanged

现在我有了这个只保存特定实体(人员)的方法

这用于保存完整图形(在基本泛型类中):

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


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

您可以在设置属性的地方共享代码吗?您可以在设置属性的地方共享代码吗?
    [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>
public class Staff
{
    public Staff()
    {
        Name = new Name();
    }

    public int Id { get; set; }
    public Name Name { get; set; }
    ...
    public virtual Role Role { get; set; }
    ...
}
    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);
    }
        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();
        }