我对这个实体框架Object Services Overview (Entity Framework)很新,所以如果我在这里使用错误的术语,请原谅我。
我正在使用EDMX文件连接到SQLite数据库。我正在尝试通常使用ObjectSet<T>
来访问数据库中表的对象集合。但是,我还想在该集合中的对象中另外存储一些仅运行时的数据。在我的情况下,我有一组存储在数据库中的设备,但在启动时,我想将它们标记为“已连接”或“已断开连接”,并在整个执行过程中跟踪此状态。
由于EDMX生成的(行)类型为partial
,我添加了另一个部分定义,并在那里添加了public bool Connected
属性。这个似乎可以工作,我可以设置它,未来的查询提供的对象具有我之前设置的相同值。问题是,我不知道a)它是如何工作的,或者b)我是否可以相信它。这些疑问来自于这些不是我们正在处理的真正对象集合的事实,对吗?
希望这是有道理的,否则我可以提供更多细节。
答案 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]
属性,如果从代码优先模型生成新数据库,则确保该属性不会包含在表中。
我希望我能为你澄清一些事情。