![](/img/trans.png)
[英]Updating a record using Entity Framework context without manually setting properties
[英]How to access entity's properties outside context using Entity Framework?
我是 Entity Framework 的新手(之前主要使用 NHibernate 和 ActiveRecord)並且我遇到了一些問題,我認為這應該很容易......
我有一個User
實體,並創建了部分User
class,因此我可以添加一些方法(例如使用 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);
似乎不是一個好的選擇...
我已經閱讀了有關存儲庫模式的信息,但我認為它對於此類任務來說太大了。 請解釋一下我做錯了什么。 提前致謝!
編輯
想象一下我想做的事情:
//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
。沒有上下文的答案......
您正在關閉 object 上下文,然后嘗試將日志添加到已分離的用戶。 您需要附加用戶,以便 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();
}
}
更新
您還可以連接 object。
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();
}
}
如果您願意使用存儲過程(並且它們與 EF 配合得很好),您可以返回用戶 object 並同時通過一次調用數據庫將其添加到日志表中。
在我之前 EF/ORM 的日子里,我曾經用 SP 做所有事情,當我去 EF 時,我非常努力地避免使用存儲過程以避免回到我的舊習慣,但現在我發現選擇性地使用存儲您可以同時享受 EF 做事方式和編寫良好的 SP 可以提供的超級功能/性能的好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.