0

我对这个 Entity Framework Object Services Overview (Entity Framework)很陌生,所以如果我在这里使用了错误的术语,请原谅我。

我正在使用 EDMX 文件连接到 SQLite 数据库。我正在尝试做的是ObjectSet<T>正常使用,从数据库中的表中访问对象集合。但是,我想在该集中的对象中另外存储一些仅运行时数据。就我而言,我有一组设备存储在数据库中,但在启动时,我想将它们标记为“已连接”或“已断开连接”,并在整个执行过程中跟踪此状态。

由于 EDMX 生成的(行)类型是partial我添加了另一个部分定义,并在public bool Connected那里添加了我的属性。这似乎可行,我可以设置它,并且将来的查询会为对象提供与我之前设置的值相同的值。问题是,我不知道a)它是如何工作的,或者b)我是否可以信任它。这些疑问来自这样一个事实,即这些并不是我们正在处理的对象的真正集合,对吧?

希望这是有道理的,否则我可以提供更多细节。

4

1 回答 1

2

你正在做的事情是完全安全的。

ObjectSet 仍然是对象的集合。在下面添加了很多魔法。我不是内部专家,但我认为它是这样工作的:

实体框架有一个 StateTracker 帽子,可以跟踪您正在使用的所有实体。

EDMX 模型中的每个类都需要有一个密钥。EF 在内部使用该键,因此它只将该特定对象加载到内存中一次。

var foo = db.Foos.Single(x => x.Id == 1); // foo with Id 1 is unique (in memory)
var foo2 = db.Foos.Single(x => x.Id == 1); // same instance of foo, but with updated values
var foo3 = db.Foos.Single(x => x.Id == 2) // a new unique instance (Id = 2)

bool sameObject = Object.Equals(foo, foo2); // will return true;

在每次选择时都会发生以下情况:

Foo 类的实例是否已经被跟踪/它是否已经存在?

是 -> 从数据库中更新现有实例的属性。
否 -> 创建类 Foo 的新实例(从数据库中获取值)

当然,它只能更新映射的属性。所以你在部分类中定义的那些不会被覆盖。

如果您要先使用代码。还有一个[NotMapped]属性,它确保如果您从代码优先模型生成新数据库,则该属性不会包含在表中。

我希望我能为你澄清一些事情。

于 2012-06-12T19:10:38.843 回答