Отключение генерации теневого свойства - PullRequest
0 голосов
/ 02 июля 2018

У меня странная проблема с настройкой внешних ключей Entity Framework Core. EF продолжает автоматически добавлять свойство shadow для моего свойства и создает его внешний ключ.

Однако для меня это было бы прекрасно - я хочу иметь возможность установить поведение удаления внешнего ключа каскадно - используя это «автоматическое» свойство тени, мне не разрешено это делать.

Поэтому я решил создать свой собственный внешний ключ с помощью Fluent API:

modelBuilder.Entity<PostDataModel>(e =>
{
    // Primary key
    e.HasKey(c => c.Id);

    // Relation
    e.HasOne<PostGroupDataModel>()
        .WithMany()
        .HasForeignKey("GroupId")
        .OnDelete(DeleteBehavior.Cascade)
        .IsRequired();
});

Это, однако, не сильно помогло - автоматически сгенерированное свойство тени все еще генерируется для таблицы (GroupId1):

enter image description here

public class PostGroupDataModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Params { get; set; }

    public List<PostDataModel> Posts { get; set; }
}

public class PostDataModel
{
    public int Id { get; set; }

    public string Content { get; set; }

    public PostGroupDataModel Group { get; set; }
}

Есть ли способ отключить автоматическую генерацию свойства тени в EF Core? или хотя бы изменить сгенерированное свойство тени для удаления на каскаде?

1 Ответ

0 голосов
/ 02 июля 2018

Проблема не в свойстве shadow, а в свободной конфигурации:

e.HasOne<PostGroupDataModel>()
    .WithMany()

Используя перегрузки без параметров, вы фактически указываете EF создать связь с без навигационных свойств на обоих концах, что и происходит. Однако у вас есть свойства навигации, поэтому EF Core создает другое отношение с обычным именем свойства / столбца FK. Просто потому, что имя по умолчанию GroupId уже зарезервировано для ваших явных отношений, оно добавляет номер к нему, чтобы сделать его уникальным.

Решение состоит в том, чтобы всегда использовать перегрузки Has / With, которые представляют наличие / отсутствие свойства навигации. В вашем случае:

e.HasOne(x => x.Group)
    .WithMany(x => x.Posts)

Вы можете оставить оставшуюся часть свободно конфигурируемой конфигурации, но, поскольку GroupId является значением по умолчанию свойства / столбца FK, в этом случае, .HasForeignKey("GroupId") можно пропустить. Кроме того, поскольку DeleteBehavior.Cascade является значением по умолчанию для требуемых отношений, .OnDelete(DeleteBehavior.Cascade) также может быть пропущено, и единственным оставшимся может быть .IsRequired(). * Т.е. 1023 *

.HasForeignKey("GroupId") // optional
.OnDelete(DeleteBehavior.Cascade) // optional
.IsRequired();

Конечно, их явное указание не повредит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...