升级到 2.1 会破坏现有的 .net 核心 EF 逻辑

Upgrade to 2.1 breaks existing .net core EF logic

我有 2 个对象,它们之间存在 FK 关系。当我使用 .net core 2 时,所有这些逻辑都运行良好,但当我升级到 2.1

时就崩溃了
public class Parent
{
     [Key()]
     public Guid ParentGUID {get;set;}
     public string SomeValue {get;set;}
     [ForeignKey("ReferenceTypeGUID")]
     public ReferenceType ReferenceTypeObject {get;set;}
}
public class ReferenceType
{
     [Key()]
     public Guid ReferenceTypeGUID{get;set;}
     public string SomeOtherValue {get;set;}
     public virtual ICollection<Parent> ParentGU { get; set; }
}

然后在我的 dbcontext 中我有

 modelBuilder.Entity<ReferenceType>(entity =>
        {
            entity.HasKey(e => e.ReferenceTypeGUID);

                entity.HasMany(c => c.ParentGU)
                    .WithOne(e => e.ReferenceTypeObject)
                    .HasForeignKey(f => f.ParentGUID)
                    .OnDelete(DeleteBehavior.ClientSetNull);
});

现在在我的原始代码中,我没有 HasForeignKey 行,并且出现以下错误:

无法定位主键,因为它不兼容

添加该行解决了该问题,但现在我得到了

操作数类型冲突:int 与 uniqueidentifier 不兼容

出于某种原因,EF 假设数据库类型应该是 int 而不是 uniqueidentifier,即使对象被声明为 GUID。我该如何解决这个问题?

当您通过 ForeignKey 注释定义影子 FK 属性 时,看起来 EF Core 2.1 引入了一个错误(坦率地说,我根本不知道它受支持)。它错误地假定 intint? 类型为该阴影 属性 而不是考虑引用的 PK 属性 类型。

如果愿意,您可以在他们的问题跟踪器中填写问题。但我不建议为此目的使用 ForeignKey 属性(或根本不推荐关系的数据注释)。

您可以通过将以下内容添加到 Parent 实体流畅配置来修复它:

entity.Property<Guid?>("ReferenceTypeGUID");

但是如果你想为影子配置一个不同的数据库列名,这是有意义的 属性。

更好的 (IMO) 方法是 删除 ForeignKey 属性并简单地使用带有 string foreignKeyPropertyNames 参数的 HasForeignKey 重载:

entity.HasMany(c => c.ParentGU)
    .WithOne(e => e.ReferenceTypeObject)
    .HasForeignKey("ReferenceTypeGUID") // <--
    .OnDelete(DeleteBehavior.ClientSetNull);