在ObjectSet <t> </t>中的对象中存储运行时数据

时间:2012-05-31 17:32:42

标签: c# entity-framework

我对这个实体框架Object Services Overview (Entity Framework)很新,所以如果我在这里使用错误的术语,请原谅我。

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

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

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

1 个答案:

答案 0 :(得分: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类的实例是否已被跟踪/它是否已存在?

是 - &gt;从数据库更新现有实例的属性 不 - &gt;创建类Foo的新实例(从数据库中获取值)

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

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

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