实体框架MVC和来自数据库的“静态”对象

时间:2013-07-12 10:47:51

标签: asp.net-mvc entity-framework

我的数据库中有一个表,我在其中放置了USA的状态(只是ID和州名)。

我想在我的控制器中获取这些值 - 我是否应该执行标准操作:在我的EF中添加上下文,以后获取对象?或者还有另一种方法可以获得它吗?

我不想在这个表中做任何更改,所以db.XYZ.Add,db.XYZ.SaveChanges()等方法对我来说并不重要。

获取“状态”等对象或“邮政编码”基础的最佳做法是什么?

后来,第二个问题:代码中的“虚拟”是什么意思:

[Table("Users")]
public class User
{
    (..)
    public virtual string UserType { get; set; }

问候!

3 个答案:

答案 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();

其中state1State个对象,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;

当然,如果你愿意,你可以添加一些条件。