我有一个value对象,这意味着它的属性有getters但没有setters。然后,我有了一个具有公共获取者和私有领域的实体。类似于以下内容:
public class Settings {
private string _instance;
private string _domain;
public Settings(string instance,string domain) {
_instance = instance;
_domain = domain;
}
private Settings() {
_instance = default!;
_domain = default!;
}
public string Instance => _instance;
public string Domain => _domain;
}
public class Tenant {
private Guid _id;
private string _name;
private Settings _settings;
public Tenant(string name) {
_id = Guid.Empty;
_name = name;
_settings = new Settings("etc","etc");
}
private Tenant() {
_id = default;
_name = default!;
_settings = default!;
}
public Guid Id => _id;
public string Name => _name;
public Settings => _settings;
protected void OnSettingsChanged() {
// do stuff like adding domain events and sending notifications
}
public void ChangeSetting(Settings newSettings) {
// do some model validation
_settings = newSettings;
OnSettingsChanged();
}
}
我正在使用C#8,.NET Core 3和Entity Frmework Core3。现在在我的IEntityTypeConfiguration<Tenant>
实现中,用于配置说名称我没有问题,因为我可以使用HasField并传递名称私有财产。但这不适用于“设置”。在那里,我使用OwnsOne,但是没有可用的HasField属性。
builder.Property(x => x.Name)
.HasField("_name")
.HasMaxLength(100);
builder.OwnsOne(x.Settings,y => {
y.Property(z => z.Instance)
.HasField("_instance")
.isrequired(true);
y.Property(z => z.Domain)
.HasField("_domain")
.isrequired(true);
//y.HasField() ??
});
但是,我找不到一种方法告诉EF应该将Settings属性映射到私有_settings
变量。我尝试在对Property
的呼叫之前添加对OwnsOne
的呼叫:
...
builder.Property(x => x.Settings)
.HasField("_settings");
builder.OwnsOne(x.Settings,y => {
y.Property(z => z.Instance)
.HasField("_instance")
.isrequired(true);
y.Property(z => z.Domain)
.HasField("_domain")
.isrequired(true);
});
但是当我添加迁移时,出现错误:无法将属性或导航“设置”添加到实体类型“ Tenant”,因为在实体类型“ Tenant”上已经存在具有相同名称的属性或导航,之所以发生这种情况,是因为我两次配置属性“设置”。
那么我该如何实现呢?使用OwnsOne时,HasField相当于什么?提前致谢。