Должен ли я иметь один или два набора DbSet?

Я кодирую интернет-приложение MVC5 C#, и у меня есть класс с именем MapCompany и класс с классом MapLocation.

Каждый MapCompany имеет список MapCompany's. Мой вопрос в том, что для класса контекста я должен просто иметь DbSet<MapCompany> и добавить MapLocations к конкретному MapCompany, или я должен иметь как DbSet<MapCompany>, так и DbSet<MapLocation>?

ИЗМЕНИТЬ

Вот немного информации о приложении:

  1. Каждая MapCompany может иметь много MapLocations ~ 5-25
  2. Я хочу иметь доступ к любому MapLocation по его идентификатору

Поскольку я хочу иметь доступ к каждому MapLocation по его идентификатору, будет ли много поиска в базе данных, если есть только DbSet<MapCompany>, так как мне придется искать через каждую MapCompany, чтобы найти MapLocation по ее идентификатору?

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

В любом случае, у каждой MapCompany должно быть много MapLocations, и мне нужно иметь возможность эффективно извлекать любой объект по его собственному идентификатору.

С этой приведенной выше информацией меня интересует, следует ли мне кодировать DbSet для каждого объекта.


person user3736648    schedule 18.07.2014    source источник
comment
Я удалил тег asp.net-mvc, потому что он не имеет отношения к Entity Framework в контексте этого вопроса.   -  person Erik Philips    schedule 18.07.2014
comment
Вы хотите иметь реляционную целостность между MapCompany и MapLocation в базе данных?   -  person Yuliam Chandra    schedule 18.07.2014
comment
Не могли бы вы объяснить, что вы подразумеваете под реляционной целостностью?   -  person user3736648    schedule 18.07.2014
comment
@ user3736648, вы хотите, чтобы у MapLocation было ограничение внешнего ключа для MapCompany?   -  person Yuliam Chandra    schedule 18.07.2014
comment
Можешь взглянуть на мою правку? Не знаю нужен он мне или нет...   -  person user3736648    schedule 18.07.2014
comment
@ user3736648, посмотри на мой ответ   -  person Yuliam Chandra    schedule 18.07.2014


Ответы (3)


Если у вас есть отношения внешнего ключа между этими объектами.

public class MapCompany
{
    public int Id { get; set; }
    public ICollection<MapLocation> MapLocations { get; set; } // foreign key
}
public class MapLocation
{
    public int Id { get; set; }
    public int MapCompanyId { get; set; } // foreign key
    public MapCompany MapCompany { get; set; } // foreign key
}

Можно иметь только DbSet<MyCompany>, MapLocation все равно будет генерироваться в базе данных из-за отношения внешнего ключа.

Если вы хотите также иметь DbSet<MapLocation>, это тоже нормально.

Если у вас нет DbSet<MapLocation>, но вы хотите получить к нему прямой доступ без предварительного получения объекта MyCompany, вы можете сделать это.

using (var context = new MyDbContext())
{
    var mapLocation = context.Set<MapLocation>().Find(1);
}
person Yuliam Chandra    schedule 18.07.2014
comment
Юлиам, можешь объяснить, что происходит с приведенным выше кодом MyDbContext? - person user3736648; 20.07.2014
comment
@user3736648 user3736648, как я объяснил в ответе, вы можете поместить весь свой DbSet в DbContext, чтобы убедиться, что все объекты генерируются в базу данных, но если вы хотите, чтобы ваш DbContext выглядел тонким, вы можете удалить все дочерние объекты (например, MapLocation ). Если вы сделаете это, вы все равно сможете получить доступ к MapLocation, используя context.Set‹MapLocation›() вместо context.MapLocations, тот же результат - person Yuliam Chandra; 20.07.2014

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

http://msdn.microsoft.com/en-us/library/ff649690.aspx

Я бы также установил связь между двумя вашими моделями, ЕСЛИ вы не ожидаете большого количества записей о местоположении карты для каждой MapCompany. В противном случае может быть более оптимальным возвращать список идентификаторов вместо моделей.

Трудно сказать, ничего не зная о вашем приложении.

person jennas    schedule 18.07.2014
comment
Отлично, да, используйте два набора баз данных, а также отношение внешнего ключа. Наличие двух наборов баз данных не сделает вашу базу данных больше. Объекты сделали бы это в любом случае. - person jennas; 20.07.2014

Как было предложено, вам нужно использовать шаблон репозитория... Попробуйте проверить этот пример на шаблоне репозитория:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

person andrew0007    schedule 18.07.2014