gpt4 book ai didi

c# - 如何使用 Entity Framework 在上下文之外访问实体的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:54 24 4
gpt4 key购买 nike

我是 Entity Framework 的新手(之前主要使用 NHibernate 和 ActiveRecord),我遇到了一些问题,我认为这应该很容易......

我有一个 User 实体,并创建了部分 User 类,这样我就可以添加一些方法(比如使用 NHibernate)。我添加了 GetByID 以使获取用户更容易:

public static User GetByID(int userID)
{
using (var context = new MyEntities())
{
return context.Users.Where(qq => qq.UserID == userID).Single();
}
}

现在在同一个类(class),我想记录登录的时刻,我尝试这样做:

public static void LogLoginInfo(int userID)
{
using (var context = new MyEntities())
{
var user = User.GetByID(userID);
var log = new LoginLog { Date = DateTime.Now };
user.LoginLogs.Add(log);
context.SaveChanges();
}
}

问题是我无法访问 user.LoginLogs 因为 user's 上下文已经被处理了...很可能我在这里遗漏了一些明显的东西,但总是创建完整查询,如:

context.Users.Where(qq => qq.UserID == userID).Single().LoginLogs.Add(log);

似乎不是一个好的选择...

我读过有关 Repository 模式的内容,但我认为它对于此类任务而言过于强大。请解释我做错了什么。提前致谢!

编辑

想象一下我想做什么:

//somewhere in business logic
var user = User.GetByID(userID);
var posts = user.GetAllPostsForThisMonth();
foreach(var post in posts)
{
Console.WriteLine(post.Answers.Count);
}

通常我不允许这样做,因为在没有上下文的情况下我无法获得 post.Answers...

最佳答案

您正在关闭对象上下文,然后尝试向分离的用户添加日志。您需要附加用户,以便 objectContext 知道已更改或添加的内容。

public static void LogLoginInfo(int userID)
{
using (var context = new MyEntities())
{
var user = context.User.Where(p=>p.UserID == userID); //<= The Context now knows about the User, and can track changes.
var log = new LoginLog { Date = DateTime.Now };
user.LoginLogs.Add(log);
context.SaveChanges();
}
}

更新
您还可以附加对象。

public static void LogLoginInfo(int userID)
{
using (var context = new MyEntities())
{
var user = User.GetByID(userID);
var log = new LoginLog { Date = DateTime.Now };
user.LoginLogs.Add(log);
context.User.Attach(user);
context.SaveChanges();
}
}

更新

var getFirstLogin = from p in User.GetUserById(userId)
select p.LoginLogs.FirstOrDefault();

注意,如果 LoginLogs 是一个不同的表,您将需要使用 Include。

public static User GetByID(int userID)
{
using (var context = new MyEntities())
{
return context.Users.Include("LoginLogs").Where(qq => qq.UserID == userID).FirstOrDefault();
}
}

关于c# - 如何使用 Entity Framework 在上下文之外访问实体的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com