EF4:ObjectSet.AddObject()不起作用

时间:2011-04-22 22:40:12

标签: entity-framework entity-framework-4

我正在使用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 个答案:

答案 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 ......

的设计

我目前看到的唯一“解决方法”:

  • 介绍一个Client表,每个对象(Parent,Child)都有一个对Client的引用
  • 调用context.SaveChanges()(缺点:用户没有机会取消操作)

同时调用 Context.ParentSet.Execute(MergeOption.AppendOnly); 没有预期效果!

解决方案/解决方法:我维护自己的对象列表,用于添加/删除+设置DataSource = null,然后再添加到我的内部列表。

由于有必要设置DataSource = null,似乎EF中有一些奇怪的东西......