【发布时间】:2020-06-22 08:08:21
【问题描述】:
考虑下面的类。它试图保护对 _assignedTrays 的访问。
实际上,它运行良好,因为 EF 自动将支持字段 _assignedTrays 链接到属性 AssignedTrays - 按照惯例 (msdn)
public class Rack
{
private List<Tray> _assignedTrays = new List<Tray>();
private Rack()
{
}
public Rack(string rackId)
{
this.Id = rackId;
}
public string Id { get; private set; }
public IReadOnlyList<Tray> AssignedTrays => this._assignedTrays.AsReadOnly();
public void Assign(params Tray[] trays)
{
this._assignedTrays.AddRange(trays);
}
}
问题是,我们的编码风格禁止在变量名中使用下划线 ;-)
根据其他代码示例 (here),应该可以将 _assignedTrays 重命名为 assignedTrays,并明确告知 EF OnModelCreating 中的更改:
modelBuilder.Entity<Rack>(e =>
{
e.Property(t => t.AssignedTrays).HasField("assignedTrays");
});
但这给了我以下例外:
System.InvalidOperationException: The property 'Rack.AssignedTrays' is of type 'IReadOnlyList<Tray>' which
is not supported by current database provider. Either change the property CLR type or ignore the property
using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
我在这里缺少什么?它不应该工作吗?
【问题讨论】:
-
我认为你真的无能为力。解决方法是重命名支持字段,例如
internalAssignedTrays并添加注释说明为什么不能将其命名为其他名称,以便通过代码审查。 -
我可以进行不同的映射(
Property方法不适用于导航属性),但没有必要,因为 EF Core 约定 supports your naming style。 -
@IvanStoev 但是约定不允许没有下划线的约定。
-
@DavidG 糟糕,文档似乎不完整,
<camel-cased property name>(默认的 C# 支持字段命名约定)也受支持 - 可能具有最高优先级。 -
@IvanStoev:你是对的。我想知道为什么不使用
HasField配置时集成测试会变成绿色,但我将其归咎于“不完整的测试”......
标签: c# entity-framework-core domain-driven-design ef-core-3.1