EF4: ObjectSet.AddObject () не работает - PullRequest
3 голосов
/ 23 апреля 2011

Я устанавливаю репозиторий с Entity Framework 4 и не могу заставить работать метод ObjectSet.AddObject ().Вот код, который я использую - для простоты я скопировал его из репозитория в мой метод модульного теста:

/* m_FilePath value is passed in by test initializer. */

// Configure a SQL CE connection string  
var sqlCompactConnectionString = string.Format("Data Source={0}", m_FilePath);

// Create an Entity Connection String Builder
var builder = new EntityConnectionStringBuilder();
builder.Metadata = string.Format("res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", "Model.Notes");
builder.Provider = "System.Data.SqlServerCe.4.0";
builder.ProviderConnectionString = sqlCompactConnectionString;
var edmConnectionString = builder.ToString();

// Create object context and object set
var context = new NotesContainer(edmConnectionString);
var objectSet = context.CreateObjectSet<Note>();

// Add a note
var entity = new Note();
objectSet.AddObject(entity);

// Build assertion
var notes = objectSet.AsEnumerable();
var count = notes.Count();
Assert.AreEqual(1, count);

Возвращаемое количество равно нулю - набор объектов пуст, так что утверждение неверно.Когда я пошагово выполняю код, контекст объекта и набор объектов создаются, но перечисление набора объектов не возвращает результатов.

В чем ошибка в моем коде?Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

notes.Count() выполняется для вашего файла данных (который, я полагаю, пуст).Ваш новый объект не будет добавлен, пока вы не вызовете context.SaveChanges().

. Обратите внимание:

objectSet.AddObject(new Note()); // new object present in memory
var notes = objectSet.AsEnumerable();
var count = notes.Count();       // query against DB file; 
                                 // what's in memory at this point is irrelevant

Добавьте context.SaveChanges() после того, как вы добавите новую заметку и утверждение пройдет.Но, конечно, это порождает целый ряд новых проблем с сохранением состояния БД одинаковым для каждого запуска теста.

0 голосов
/ 17 ноября 2011

Это не совсем так.

например, Parent / Childs

При использовании Context.AddObject () для Parent не будетбудет добавляться до тех пор, пока не будет вызван Context.SaveChanges () , но при добавлении Child он будет добавлен без сохранения (, когда установлены внешние ключикурс ).

Не уверен, является ли это ошибкой или это сделано в EF ...

Единственный «обходной путь», который я вижу на данный момент:

  • представляет таблицу клиента, и каждый объект (родительский, дочерний) имеет ссылку на клиентский вызов
  • context.SaveChanges () (недостаток: пользователь не имеет возможности отменить операцию)

Также вызывается Context.ParentSet.Execute (MergeOption.AppendOnly); не имеет ожидаемого эффекта!

Решение / обходной путь: Я веду свой собственный список объектов для добавления / удаления + установки DataSource = null, а затем в свой внутренний список.

Поскольку необходимоустановить DataSource = нуль, кажется, что в EF есть что-то странное ...

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