Составные ключи и IsRequired (false) - PullRequest
0 голосов
/ 21 марта 2019

Как сообщить EF Core, если объект, к которому присоединен составной ключ, не требуется?

Моя установка выглядит следующим образом (упрощенно):

public class ParentObject
{
    public int Key1 { get; set; }

    public int Key2 { get; set; }

    public CompositeKeyObject CompositeKeyObj { get; set; }

    // ...other properties
}

public class CompositeKeyObject
{
    public int Key1 { get; set; }

    public int Key2 { get; set; }

    public int? ChildObjectId { get; set; }

    public ChildObject ChildObj { get; set; }
}

public class ChildObject
{
    public int ChildObjectId { get; set; }

    // ... other properties
}

Метод, который у меня есть дляполучение данных работает нормально, если ParentObject соответствует CompositeObject.Но это не всегда так, и я пытаюсь сделать это в свободном API, как это:

modelbuilder.Entity<CompositeKeyObject).HasKey(p => new { p.Key1, p.Key2 }
modelBuilder.Entity<ParentObject>().Property(mpo => mpo.CompositeKeyObj).IsRequired(false);

Но если я сделаю это, я получу ошибку:

ParentObject.CompositeKeyObj 'имеет тип' CompositeKeyObject ', который не поддерживается текущим поставщиком базы данных.Либо измените тип свойства CLR, либо игнорируйте свойство с помощью атрибута [NotMapped] или с помощью EntityTypeBuilder.Ignore в OnModelCreating.

Как мне сказать, что нет 't всегда совпадающий CompositeKeyObject?

1 Ответ

1 голос
/ 21 марта 2019

Просто удалите

modelBuilder.Entity<ParentObject>().Property(mpo => mpo.CompositeKeyObj).IsRequired(false);

, потому что отношения FK без явных свойств FK по умолчанию необязательны .

Но если вы хотите настроить это явно, этодолжно быть через свободный интерфейс отношений (API Property предназначен только для свойств, не относящихся к навигации):

modelBuilder.Entity<ParentObject>()
    .HasOne(e => e.CompositeKeyObj)
    .WithMany()
    .IsRequired(false); // <--

Наконец, если вам нужны явные свойства FK, просто убедитесь, что они допускают обнуление - беглая конфигурация не требуется:

public class ParentObject
{
    // ...other properties    
    public int? CompositeKeyObjKey1 { get; set; }    
    public int? CompositeKeyObjKey2 { get; set; }    
    public CompositeKeyObject CompositeKeyObj { get; set; }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...