自有实体中的外键:"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 专家的直觉):

这是一个配置问题,与拥有的实体无关。另一种情况是“EF 错误消息模糊不清,但问题显而易见”。

不幸的是,我不记得我是如何修复它的。但它是沿着“需要一个额外的构造函数和所有参数”“其中一个字段有一个构造函数参数中的不同名称 或那些经典的 EF 事故之一。