实体框架允许从数据库中获取对象而不将它们添加到更改跟踪器中:
using (var db = new MyContext())
{
var states = db.States.AsNoTracking();
...
}
但是,当您在引用中使用State
对象时,例如:
var address = new Address() { State = state1 };
db.Addresses.Add(address);
db.SaveChanges();
对象在哪里state1
,毕竟将附加到上下文并拥有!State
state1
EntityState.Added
所以你仍然应该小心如何使用这些“未跟踪”的对象。在此示例中,您最好设置一个原始StateId
属性:
var address = new Address() { StateId = state1.Id };
(不附上state1
)。
在这种情况下,您真正想要的是防止 EF 改变对象EntityState
的。State
我想不出办法来强制执行这一点。将是一个有趣的功能。
像这样的代码中的“虚拟”是什么意思
该virtual
修饰符通常用于启用导航属性的延迟加载。Address
本来可以
public virtual State State { get; set; }
现在,当您从数据库中获取地址并随后访问其State
属性时,此时会从数据库中加载状态。这是因为 EF 在底层创建了一个Address
对象,该对象是您的类的派生对象,并且已使用启用延迟加载的代码Address
覆盖了该属性。State
但是,在您显示的代码中virtual
与延迟加载无关,因为它是一个字符串属性。所以它不能是导航属性,也不允许延迟加载。