1

我得到來自EF的Code First一些奇怪的行爲時,我對象添加到數據庫,並選擇它從同一個HTTP請求的數據庫恢復。EF代碼第一次沒有返回對象DynamicProxies後才HTTP請求完成

當我找回它,它返回的對象類型,而不是類型System.Data.Entity.DynamicProxies這麼懶加載不起作用。

如果我在未來的HTTP請求檢索相同的對象則是返回類型System.Data.Entity.DynamicProxies和延遲加載工作正常。

是否需要對對象或上下文執行某些操作以獲取DynamicProxy返回?或者EF Code First的工作原理是什麼?如果是的話,我該如何解決這個問題?

我甚至使用NuGet包中的示例代碼重新創建了該問題。

下面是我用來重現問題的代碼:當我在AddPost行動得到POST2

public ActionResult Index() { 
    var blogContext = new BlogContext(); 

    var posts = blogContext.Posts; 

    ViewBag.Message = "Welcome to ASP.NET MVC!"; 
    ViewBag.Posts = posts; 

    return View(); 
} 

public ActionResult AddPost() { 
    var blogContext = new BlogContext(); 

    var post = new Post() { 
     PublishDate = DateTime.Now, 
     Text = "Text", 
     Title = "Title", 
    }; 

    blogContext.Posts.Add(post); 

    blogContext.SaveChanges(); 

    var post2 = blogContext.Posts.Find(post.ID); 

    return RedirectToAction("Index"); 
} 

public ActionResult GetPost(int id) { 
    var blogContext = new BlogContext(); 

    var post = blogContext.Posts.Find(id); 

    ViewBag.Post = post; 

    return View(); 
} 

它的類型是MvcApplication.Models.Post返回那裏,當我回到同一職位在GetPost動作它是類型System.Data.Entity.DynamicProxies.Post。

上述代碼是使用MVC 3工具更新中的默認MVC3應用程序重新創建的。我還安裝了以下NuGet包:EntityFramework.Sample和EntityFramework.SqlServerCompact。

如果有人可以重新創建問題或有解決方案,那麼將不勝感激。

回答

3

在C#中,如果調用new Post(),那麼你會得到一個Post實例,而不是Post代理亞型的一個實例。要得到一個代理,你必須調用一些不同的東西。

可以,例如,撥打DbSet<T>.Create

var post = blogContext.Posts.Create(); 
post.PublishDate = DateTime.Now; 
2

總猜測:嘗試使用blogContext.Posts.Create()而非new Post()。這樣,您的原始對象將由EF創建,而不是裸露的CLR對象。

2

你有幾個選項...

如果你不介意從上下文實例,你可以這樣做:

var post = blogContext.Posts.Create(); 

,如果你正在使用這將無法正常工作大一個存儲庫(因爲你的上下文可能會被存儲庫封裝)。

如果最終使用存儲庫,則一個選項是在附加/保存後顯式加載相關實體。例如其他

// Load the related entity 
context.Entry(post).Reference(u => u.Notes).Load(); 

一種選項可(沒有測試),不使用查找您保存後。如果您使用find,EF將嘗試首先查看上下文。