Entity Framework CTP5, Code-First. Помогите создать справочные таблицы через объектную модель

Я создаю новые модели, для которых я позволю EF создать базу данных. Модели выглядят так:

public class Model
{
    public int Id { get; set; }
    public string StyleNumber { get; set; }
    public virtual IList<Metal> Metals { get; set; }
    public virtual IList<ModelImage> Images { get; set; }
}

public class Metal
{
    public int Id { get; set; }
    public string Description { get; set; }
}

Я хотел бы, чтобы Metal был справочной таблицей с двумя столбцами, поле "Описание" является уникальным. Вместо этого EF создает таблицу Metal с дополнительным столбцом, ссылающимся на идентификатор модели. Есть ли простой способ изменить поведение с помощью аннотаций данных или плавного API?

2 ответа

Решение

EF считает, что у вас есть отношения один-ко-многим между Model & Metal и самым простым способом моделирования, который заключается в сохранении идентификатора модели в таблице Metal. Если вы хотите, чтобы таблица Metal была "чистой" (т. Е. Нет данных о взаимосвязях), тогда данные о взаимосвязях должны храниться в отдельной таблице, но при этом вы также неявно меняете отношения между Model и Metal. Если вы действительно хотите пройти через это, тогда вы можете сказать EF, что вы хотите, чтобы отношения между Model & Metal были односторонними. Вы можете сделать это так внутри функции OnModelCreating DbContext.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Model>().HasMany(o => o.Metals).WithMany();
}

Ответ Стивена К является правильным для удаления записи внешнего ключа в таблице Metal, однако он не будет приводить к выполнению уникального требования для поля Desctiption. Это не его вина, потому что, к сожалению, EF Code First пока не имеет уникальной аннотации ограничений.

Другие вопросы по тегам