Обновление до 2.1 ломает существующую логику .net core EF - PullRequest
0 голосов
/ 04 июня 2018

У меня есть 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.как я могу решить эту проблему?

1 Ответ

0 голосов
/ 04 июня 2018

Похоже, что в EF Core 2.1 появилась ошибка, когда вы определяете теневое свойство FK с помощью аннотации ForeignKey (честно говоря, я вообще не знал, что это поддерживается).Он неправильно принимает тип int или int? для этого свойства тени, а не учитывает ссылочный тип свойства PK.

При желании вы можете заполнить вопрос в их системе отслеживания проблем.Но я не рекомендую использовать для этой цели атрибут ForeignKey (или аннотации данных для отношений вообще).

Вы можете исправить это, добавив следующее в свободную конфигурацию объекта Parent:

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

но это имеет смысл, если вы хотите настроить, скажем, другое имя столбца базы данных для свойства shadow.

Лучший (IMO) способ - удалить the ForeignKey и просто используйте перегрузку HasForeignKey с параметром string foreignKeyPropertyNames:

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