代码之家  ›  专栏  ›  技术社区  ›  Phil

升级至2.1 breaks-existing.net-core-ef-logic

  •  2
  • Phil  · 技术社区  · 7 年前

    我有两个对象之间有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。如何解决此问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ivan Stoev    7 年前

    当您通过 ForeignKey 注释(坦率地说,我根本不知道这是支持的)。它错误地假设 int int? 该阴影属性的类型,而不是考虑引用的pk属性类型。

    如果你愿意的话,你可以在他们的问题跟踪器中填写一个问题。但我不建议你 外键 用于此目的的属性(或关系的数据注释)。

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

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

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

    更好的方法是 去除 这个 外键 属性并简单地使用 HasForeignKey 超载 string foreignKeyPropertyNames 参数:

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