public class ParentClass
{
[Key]
[StringLength(80)]
public string ID { get; set; } = string.Empty;
[StringLength(80)]
public string ChildID { get; set; } = string.Empty; // login name
[ForeignKey(nameof(ChildID))]
public virtual ChildClass Child { get; set; }
}
public class ChildClass
{
[Key]
[StringLength(80)]
public string ID { get; set; } = string.Empty;
}
当我从数据库中读取ParentClass
实体时,我也希望读取Child
属性。但是,当我将ParentClass
实体写入数据库时,我不希望也写入Child
属性。在ParentClass
的上下文中,它是只读属性。
将Child
设置为null会导致错误,因为EF Core 6希望存在有效数据。这发生在我的控制器到达之前,所以我没有机会将属性的状态设置为不变,就像一样
_context.Entry(parent.Child).State = EntityState.Unchanged;
我在谷歌上搜索过,也读过一些SO关于这方面的文章,但没有找到解决方案。
当属性为null时,我必须如何将ParentClass.Child
指定为只读并使EF Core忽略它?
我至少找到了解决这个问题的方法。子属性必须可以为null:
public class ParentClass
{
// ...
[ForeignKey(nameof(ChildID))]
public virtual ChildClass? Child { get; set; }
}
为了保持这种集中性,我为每个类提供了一个单独的函数,用于相应地设置属性状态:
void IgnoreProperties(MyClass ent)
{
if (ent.Prop1 != null)
_context.Entry(ent.Prop1).State = EntityState.Unchanged;
if (ent.Prop2 != null)
_context.Entry(ent.Prop2).State = EntityState.Unchanged;
}
[HttpPost("Add")]
[AllowAnonymous]
public async Task<IActionResult> Add([FromBody] MyClass ent)
{
IgnoreProperties(ent);
_context.Table1.Add(ent);
await _context.SaveChangesAsync();
return Ok();
}
同时将其状态设置为EntityState。未更改,这导致EF Core在父实体更改时不想将子属性实例写回其DB表。