我正在使用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);
返回的计数为零 - 对象集为空,因此断言失败。当我单步执行代码时,会创建对象上下文和对象集,但是对象集的枚举不会返回任何结果。
我的代码中出现了什么错误?谢谢你的帮助。
答案 0 :(得分:1)
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()
并且断言将传递。但是,当然,这会引入全新的问题范围,以便在每次测试运行时保持DB状态相同。
答案 1 :(得分:0)
这不完全正确。
e.g。家长/孩子
对父使用 Context.AddObject()时,在调用 Context.SaveChanges()之前不会添加它添加孩子 将添加而不保存(当设置外键时)。
不确定它是否是一个错误,或者它是否符合EF ......
的设计我目前看到的唯一“解决方法”:
同时调用 Context.ParentSet.Execute(MergeOption.AppendOnly); 没有预期效果!
解决方案/解决方法:我维护自己的对象列表,用于添加/删除+设置DataSource = null,然后再添加到我的内部列表。
由于有必要设置DataSource = null,似乎EF中有一些奇怪的东西......