升级到 2.1 会中断现有的 .net 核心 EF 逻辑



>我有 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; }
}

然后在我的数据库上下文中,我有

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 与唯一标识符不兼容

出于某种原因,EF 假定数据库类型应为 int 而不是唯一标识符,即使对象声明为 GUID。 如何解决此问题?

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

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

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

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

但是,如果要为 shadow 属性配置不同的数据库列名称,这是有意义的。

更好的 (IMO( 方法是删除ForeignKey属性并简单地将HasForeignKey重载与参数一起使用string foreignKeyPropertyNames

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

相关内容

  • 没有找到相关文章

最新更新