升级到 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 引入了一个错误(坦率地说,我根本不知道它受支持)。它错误地假定 int
或 int?
类型为该阴影 属性 而不是考虑引用的 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);
我有 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 引入了一个错误(坦率地说,我根本不知道它受支持)。它错误地假定 int
或 int?
类型为该阴影 属性 而不是考虑引用的 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);