自有实体中的外键:"There is no corresponding CLR property or field"
Foreign key in Owned entity: "There is no corresponding CLR property or field"
这是一个关于可选拥有的实体和外键的故事。
我正在使用 EF 5(代码优先)并且我这样做了:
public class Parent {
public Guid Id { get; private set; }
public OwnedType1? Owned1 { get; private set; }
public OwnedType2? Owned2 { get; private set; }
public Parent(Guid id, OwnedType1? owned1, OwnedType2? owned2) {
Id = id; Owned1 = owned1; Owned2 = owned2;
}
}
public class OwnedType1 {
public Guid? OptionalExternalId { get; private set; }
public OwnedType1 (Guid? optionalExternalId) {
OptionalExternalId = optionalExternalId;
}
}
public class OwnedType2 {
public Guid? OptionalExternalId { get; private set; }
public OwnedType2 (Guid? optionalExternalId) {
OptionalExternalId = optionalExternalId;
}
}
public class Shared {
public Guid Id { get; private set; }
public Shared (Guid id) {
Id = id;
}
}
现在,配置:
//-------- for Parent ------------
public void Configure(EntityTypeBuilder<Parent> builder) {
builder
.ToTable("Parents")
.HasKey(p => p.Id);
builder
.OwnsOne(p => p.Owned1)
.HasOne<Shared>()
.WithMany()
.HasForeignKey(x => x.OptionalExternalId);
builder
.OwnsOne(p => p.Owned2)
.HasOne<Shared>()
.WithMany()
.HasForeignKey(x => x.OptionalExternalId);
}
//-------- for OwnedType1 ------------
// (there's no builder as they're owned and EntityTypeBuilder<Parent> is enough)
//-------- for OwnedType2 ------------
// (there's no builder as they're owned and EntityTypeBuilder<Parent> is enough)
//-------- for Shared ---------------
public void Configure(EntityTypeBuilder<Shared> builder) {
builder
.ToTable("Shareds")
.HasKey(p => p.Id);
}
旁注:如果您想知道为什么 OwnedType1 和 OwnedType2 不各自有一个名为 'ParentId' 的 属性,那是因为它是由“OwnsOne”隐式创建的。
我的问题是:
当我创建一个新的迁移时,OwnedType1 就像一个魅力,但对于 OwnedType2(它是准相同的),我得到了他的错误:
The property 'OptionalExternalId' cannot be added to the type
'MyNameSpace.OwnedType2' because no property type was specified and
there is no corresponding CLR property or field. To add a shadow state
property, the property type must be specified.
我不明白它在抱怨什么。 以及为什么它只针对其中一个抱怨。
我知道您可能无法使用我的架构的这个简化版本来解决它,但我要问的是您认为它可能是什么(跟随您对 EF 专家的直觉):
- 缺少构造函数?
- 其中一个字段的可见性不正确?
- 导航定义错误?
- 打字错误?
- 有些棘手的事情(例如:如果您要让两个不同的实体 类 与 Shared 具有一对多关系,那么它们不能对外部密钥使用相同的名称。或者我需要使用复合键。或者诸如此类的东西)。
这是一个配置问题,与拥有的实体无关。另一种情况是“EF 错误消息模糊不清,但问题显而易见”。
不幸的是,我不记得我是如何修复它的。但它是沿着“需要一个额外的构造函数和所有参数”或“其中一个字段有一个构造函数参数中的不同名称 或那些经典的 EF 事故之一。
这是一个关于可选拥有的实体和外键的故事。
我正在使用 EF 5(代码优先)并且我这样做了:
public class Parent {
public Guid Id { get; private set; }
public OwnedType1? Owned1 { get; private set; }
public OwnedType2? Owned2 { get; private set; }
public Parent(Guid id, OwnedType1? owned1, OwnedType2? owned2) {
Id = id; Owned1 = owned1; Owned2 = owned2;
}
}
public class OwnedType1 {
public Guid? OptionalExternalId { get; private set; }
public OwnedType1 (Guid? optionalExternalId) {
OptionalExternalId = optionalExternalId;
}
}
public class OwnedType2 {
public Guid? OptionalExternalId { get; private set; }
public OwnedType2 (Guid? optionalExternalId) {
OptionalExternalId = optionalExternalId;
}
}
public class Shared {
public Guid Id { get; private set; }
public Shared (Guid id) {
Id = id;
}
}
现在,配置:
//-------- for Parent ------------
public void Configure(EntityTypeBuilder<Parent> builder) {
builder
.ToTable("Parents")
.HasKey(p => p.Id);
builder
.OwnsOne(p => p.Owned1)
.HasOne<Shared>()
.WithMany()
.HasForeignKey(x => x.OptionalExternalId);
builder
.OwnsOne(p => p.Owned2)
.HasOne<Shared>()
.WithMany()
.HasForeignKey(x => x.OptionalExternalId);
}
//-------- for OwnedType1 ------------
// (there's no builder as they're owned and EntityTypeBuilder<Parent> is enough)
//-------- for OwnedType2 ------------
// (there's no builder as they're owned and EntityTypeBuilder<Parent> is enough)
//-------- for Shared ---------------
public void Configure(EntityTypeBuilder<Shared> builder) {
builder
.ToTable("Shareds")
.HasKey(p => p.Id);
}
旁注:如果您想知道为什么 OwnedType1 和 OwnedType2 不各自有一个名为 'ParentId' 的 属性,那是因为它是由“OwnsOne”隐式创建的。
我的问题是:
当我创建一个新的迁移时,OwnedType1 就像一个魅力,但对于 OwnedType2(它是准相同的),我得到了他的错误:
The property 'OptionalExternalId' cannot be added to the type 'MyNameSpace.OwnedType2' because no property type was specified and there is no corresponding CLR property or field. To add a shadow state property, the property type must be specified.
我不明白它在抱怨什么。 以及为什么它只针对其中一个抱怨。
我知道您可能无法使用我的架构的这个简化版本来解决它,但我要问的是您认为它可能是什么(跟随您对 EF 专家的直觉):
- 缺少构造函数?
- 其中一个字段的可见性不正确?
- 导航定义错误?
- 打字错误?
- 有些棘手的事情(例如:如果您要让两个不同的实体 类 与 Shared 具有一对多关系,那么它们不能对外部密钥使用相同的名称。或者我需要使用复合键。或者诸如此类的东西)。
这是一个配置问题,与拥有的实体无关。另一种情况是“EF 错误消息模糊不清,但问题显而易见”。
不幸的是,我不记得我是如何修复它的。但它是沿着“需要一个额外的构造函数和所有参数”或“其中一个字段有一个构造函数参数中的不同名称 或那些经典的 EF 事故之一。