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 пока не имеет уникальной аннотации ограничений.