我有如下内容:
public class EntityA
{
[Required]
long? EntityBId { get; set; }
[ForeignKey("EntityBId ")]
public virtual EntityB { get; set; }
}
public class EntityB
{
[Key]
long EntityBId { get; set; }
}
当我按如下所述使用它时,由于必填属性EntityBId
为空,因此我收到验证错误。
EntityA a = new EntityA();
a.EntityB = new EntityB();
dbContext.EntityAs.Add(EntityA);
dbContext.SaveChanges();
但是,如果我删除了[Required]
属性,那么EntityA
和EntityB
都会被添加到数据库中,并且EntityBId
会被SaveChanges
调用填充。 / p>
如何将EntityBId
标记为[Required]
并避免实体框架验证失败?
答案 0 :(得分:0)
请参阅此链接以了解必需注释的用法:https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations-
“ Required注释告诉EF特定属性是 必填。
将Title添加到Title属性将强制EF(和MVC)执行以下操作: 确保该属性中包含数据。”
因此,您必须决定是否要使用[Required]注释,这意味着它将不允许可为空的属性。如果您可以使用null值,请删除[Required]注释。
答案 1 :(得分:0)
可能有两种情况:
首先:EntityB
已存在于数据库中,并且您将EntityBId
的{{1}}指向EntityB
{{1}新EntityBId
中的},如下所示,在这种情况下,仅将ForeignKey
插入数据库:
EntityA
第二个:EntityA
在数据库中尚不存在,它将与EntityB entityB = dbContext.EntityBs.FirstOrDefault(yourCondition)
EntityA entityA = new EntityA();
entityA.EntityBId = entityB.EntityBId; // <-- assign `ForeignKey` value instead of navigation property value, hence no required validation error will occur
dbContext.EntityAs.Add(entityA);
dbContext.SaveChanges();
一起新插入数据库中。因此,在这种情况下,您的代码应如下所示:
EntityB
现在确定您的情况并进行相应的操作。