EF核心6:使导航只读


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表。

相关内容

  • 没有找到相关文章

最新更新