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