ObjectSet <T>.AddObject () против EntityCollection <T>.Add () - PullRequest
4 голосов
/ 05 июля 2011

Допустим, у меня есть два EntitySet, "Команды" и "Игроки".

Я добавляю новые команды в систему, ради аргумента, скажем, я добавляю тысячу команд из файла (который содержит дубликаты).

Система содержит 100 команд для запуска.И моя цель - избежать дубликатов, не вызывая SaveChanges () для каждой добавленной команды.

Процесс состоит в том, чтобы запросить, что новая команда еще не существует, затем добавить новую команду, если она не существует.

    var team = (from t in context.Teams
    where t.Name == newTeam.Name
    select t).FirstOrDefault();

if (team==null)
--Add New Team

Если я добавлю с помощью context.Teams.AddObject(newTeam); или context.AddObject("Teams",newTeam);

team.Count () останется равным 100, и если вы снова запустите запрос, var team будет нулевым.

Однако, если я вместо этого использую player.Teams.Add(newTeam); для добавления команды, все работает отлично, за исключением того, что мне нужен игрок, чтобы добавить NewTeam, и этот игрок будет членом всех новых команд.

После вызова player.Teams.Add(newTeam); Запрос вернет новую команду.

 var team = (from t in player.teams
where t.Name = newTeam.Name
select t).FirstOrDefault();

player.Teams.Count() увеличится на единицу.

В первом примере context.Teams является ObjectSet<T>,, тогда как в player.Teams.Add Teams это EntityCollection<T>.Я бы подумал, что они будут вести себя одинаково, но это не так.

Есть ли способ заставить ObjectSet<T> вести себя как EntityCollection<T>?Я хочу вызывать SaveChanges один раз и только один раз после добавления всех команд из файла.

Или есть лучший способ, которого я не вижу?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

Нет, нет способа заставить их вести себя одинаково. ObjectSet представляет запрос к базе данных, и как только вы его используете, вы всегда делаете запрос к базе данных, где ваша новая команда еще не присутствует. EntityCollection - это локальная коллекция загруженных объектов, и если вы используете ее, вы делаете запрос в память вашего приложения.

Обычно использование EntityCollection - это то же самое, что ведение отдельного List<Team>:

List<Team> teams = context.Teams.ToList();

var team = teams.FirstOrDefault(t => t.Name == newTeam.Name);
if (team == null) 
{
    context.Teams.AddObject(newTeam);
    teams.Add(newTeam);
}

context.SaveChanges();

Вы также можете использовать Dictionary<string, Team> и получить, вероятно, лучшую производительность вместо поиска в списке для каждой команды.

0 голосов
/ 05 июля 2011

"Если я добавлю, используя context.Teams.AddObject (newTeam); или context.AddObject (" Teams ", newTeam);

team.Count () останется равным 100, и если вы снова запустите запрос, команда var будет иметь значение null. "

Команды не будут добавлены, пока вы не вызовете метод SaveChanges ().

Я предполагаю, что, добавляя свойство Navigation таблицы Player, оно фактически записывает данные в таблицу Team перед вызовом метода SaveChanges ().

Я бы подумал о том, чтобы поместить все новые команды в список, а затем запустить отдельную группу в этом списке. Может быть, что-то вроде этого ...

//an array of the new teams
var newTeams = {"Chi","Cle","La","Ny"};

//a list of the teams in the database
var teamsInDb = context.Teams.ToList();

//a query to get the unique teams that are not in the database
var uniqueTeams = newTeams.Where(t => !teamsInDb.Contains(t)).Distinct();

//iterate the new teams and add them
foreach(var t in uniqueTeams)
{
    context.Teams.AddObject(t);
}

//save
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...