当我保存具有我用作外键的导航属性的实体时:
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; }
...
}
答案 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();
}
如果有人有更合适的解决方案,我很乐意知道,谢谢。