Какой смысл создавать свойства внешнего ключа при использовании Entity Framework Code First? - PullRequest
7 голосов
/ 13 февраля 2012

Просматривая вопросы и ответы на этом сайте и читая некоторые из лучших руководств Google по разработке кода First, я часто вижу следующую схему ...

public class Category
{
    public Category()
    {
        Products = new Collection<Product>();
    }
    public Guid ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public DateTime DateAdded { get; set; }
    public Guid CategoryID { get; set; } // Seemingly redundant property
    public virtual Category Category { get; set; }
}

При поиске учебников Code First появляются следующие две страницы, использующие этот же шаблон:

http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

http://www.codeproject.com/Articles/327945/Architecture-Guide-ASP-NET-MVC3-Entity-Framework-C

Вопрос: Так какой смысл иметь свойство внешнего ключа в объекте Code First C #? В приведенном выше примере вы можете опустить CategoryID из класса Product, и все будет работать нормально. Внешний ключ Category_ID все еще будет создан в базе данных.

Единственное, о чем я могу подумать, это то, что люди могут захотеть указать, являются ли отношения необязательными, используя обнуляемые типы вместо свободного API, но я думаю, что это действительно сбивает с толку наличие Category и CategoryID собственность.

Итак, прежде чем я обойду и уберу все свои свойства внешнего ключа, есть ли что-то, что я здесь упускаю? Какой смысл делать это?

Спасибо!

1 Ответ

8 голосов
/ 13 февраля 2012

Да, я думаю, что нет необходимости в свойствах внешнего ключа, и они являются каким-то образом реляционным артефактом в объектном мире. Вы можете определить отношения полностью без свойств FK. В Fluent API вы можете определить, является ли связь необязательной или обязательной, а также можете указать имя столбца внешнего ключа таблицы базы данных. Отношения тогда называются Независимая ассоциация .

Насколько я понимаю, Связи внешних ключей - отношения с открытыми свойствами внешнего ключа в классе модели - существуют только для того, чтобы сделать работу со связями в Entity Framework немного проще и удобнее в определенных сценариях. Например:

Предположим, у вас есть веб-представление для создания или редактирования продукта, а представление содержит поле со списком, чтобы выбрать категорию и назначить ее для продукта. Чтобы заполнить поле со списком при визуализации представления, вы должны загрузить, например, ID и Name всех категорий из базы данных.

Когда страница будет отправлена ​​обратно, вы получите свойства продукта и ID выбранной категории. Если у вас нет свойства внешнего ключа CategoryID в вашем Product, вы должны создать отношения следующим образом:

var category = new Category { ID = IDFromComboBox };
context.Categories.Attach(category);
product.Category = category;

Для свойства FK вам нужна только одна строка:

product.CategoryID = IDFromComboBox;

Свойства внешнего ключа не существовали в Entity Framework версии 1 (.NET 3.5) и были представлены в EF версии 4 (.NET 4) для лучшей поддержки сценариев, подобных приведенным выше.

Можно найти критический взгляд на ассоциацию внешних ключей, и разница между двумя типами ассоциаций очень хорошо обсуждается в блоге Ладислава:

http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/

...