簡體   English   中英

如何使用實體框架在上下文之外訪問實體的屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM