1

我的数据库中有一张表,我在其中放置了美国的州(只有 ID 和州名)。

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

我不想在此表中进行任何更改,因此 db.XYZ.Add、db.XYZ.SaveChanges() 等方法对我来说并不重要。

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

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

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

问候!

4

3 回答 3

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,毕竟将附加到上下文并拥有!Statestate1EntityState.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与延迟加载无关,因为它是一个字符串属性。所以它不能是导航属性,也不允许延迟加载。

于 2013-07-12T14:22:49.960 回答
0

在代码中,我首先使用枚举来保存具有 int id 和描述的项目。

为此,我添加以下内容:

在用户中添加:

...

public int StateId { get; set; }

public State State
{
   get { return (State)StateId ; }
}
...

创建一个枚举:

public enum State
{
    State1,
    State2
}

每次我保存用户时,枚举 ID 都会保存回StateIdUser

于 2013-07-12T10:57:43.523 回答
0

在此链接上,您可以在代码中找到有关“虚拟”的更多信息

要获得所有状态,您可以轻松执行以下操作:

var getStates = from i in db.States select i;

当然,如果需要,您可以添加一些条件。

于 2013-07-12T14:35:49.097 回答