我的数据库中有一个表,我在其中放置了USA的状态(只是ID和州名)。
我想在我的控制器中获取这些值 - 我是否应该执行标准操作:在我的EF中添加上下文,以后获取对象?或者还有另一种方法可以获得它吗?
我不想在这个表中做任何更改,所以db.XYZ.Add,db.XYZ.SaveChanges()等方法对我来说并不重要。
获取“状态”等对象或“邮政编码”基础的最佳做法是什么?
后来,第二个问题:代码中的“虚拟”是什么意思:
[Table("Users")]
public class User
{
(..)
public virtual string UserType { get; set; }
问候!
答案 0 :(得分:2)
实体框架允许从数据库中获取对象,而无需将其添加到更改跟踪器:
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
与延迟加载无关,因为它是一个字符串属性。所以它不能是导航属性,也不允许延迟加载。
答案 1 :(得分:0)
在代码中,我首先使用枚举来保存带有int id和description的项目。
要这样做,我添加以下内容:
在用户添加:
...
public int StateId { get; set; }
public State State
{
get { return (State)StateId ; }
}
...
创建一个枚举:
public enum State
{
State1,
State2
}
每次保存用户时,枚举ID都会以StateId
的形式保存回User
。
答案 2 :(得分:0)
On this link you can find more about "virtual" in your code
要获得所有州,您可以轻松完成此任务:
var getStates = from i in db.States select i;
当然,如果你愿意,你可以添加一些条件。