Entity Framework Отношения один ко многим
В отношении «один ко многим» каждая строка данных в одной таблице связана с одной или несколькими строками во второй таблице. Это самый распространенный тип отношений.
- Отношение «один ко многим» возникает, когда первичный ключ одной таблицы становится внешним ключом в другой таблице.
- Внешний ключ определен в таблице, которая представляет собой конец множества отношений.
Допустим, у нас есть объекты Author
и Book
.
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
}
Настройте отношения один-ко-многим
В EF6 в большинстве случаев вам не нужно настраивать отношение «один ко многим», поскольку соглашения «один ко многим» охватывают все комбинации. Вы можете установить отношение «один ко многим», используя любое из следующих соглашений в отношении кода.
Code First Conventions
Добавить свойство ссылки навигации
Включите свойство ссылочной навигации типа Author
в класс сущности Book
.
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public Author Author { get; set; }
}
Добавление Author
навигации свойство будет создавать отношения один-ко-многим между Authors
и Books
таблиц в базе данных путем добавления внешнего ключа Author_AuthorId
для Books
таблицы.
Добавить свойство навигации коллекции
Вы можете достичь отношения один ко многим, добавив свойство навигации по коллекции сущности Book
в класс сущности Author
.
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
}
Добавить свойства навигации в обоих объектах
Добавление свойств навигации в обоих объектах также приведет к взаимосвязи «один ко многим». Например, класс Author
содержит коллекцию Books
а класс Book
содержит свойство навигации типа Author
.
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public Author Author { get; set; }
}
Полностью определенные отношения
Полностью определенные отношения на обоих концах также создадут отношения один ко многим. Например, сущность Book
включает свойство внешнего ключа AuthorId
со своим ссылочным свойством Author
а класс Author
содержит коллекцию Books
.
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
}
Все эти соглашения дают одинаковый результат в базе данных.
Использование Fluent API
Вы также можете настроить отношения с помощью Fluent API, чтобы переопределить соглашения по умолчанию и сделать их более удобными в обслуживании.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// configures one-to-many relationship
modelBuilder.Entity<Book>()
.HasRequired<Author>(b => b.Author)
.WithMany(a => a.Books)
.HasForeignKey<int>(b => b.AuthorId);
}