2017-09-06 32 views
1

我在更新與ASP.NET MVC中的應用程序用戶相關的實體時遇到問題。我有ApplicationUserOrder之間的一對多關係。這是我的實體和關係配置:如何使用EF6更新與ApplicationUser相關的實體?

public class ApplicationUser : IdentityUser 
{ 
    public virtual ICollection<Order> HandlingOrders { get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    //some properties 

    public string OperatorId { get; set; } 
    [ForeignKey("OperatorId")] 
    public virtual ApplicationUser Operator { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Entity<ApplicationUser>().HasMany(n => n.HandlingOrders) 
              .WithOptional(n => n.Operator) 
              .HasForeignKey(n => n.OperatorId); 
} 

的問題是,當我嘗試保存Order在我的控制器,它失敗InvalidOperationException和消息

兩個對象之間的關係不能定義因爲它們連接到不同的ObjectContext對象。

這是因爲一方面我使用「工作單元」和「通用庫」來保存Order。從另一方面我使用ApplicationUserManager來節省ApplicationUser

public class OperatorController : Controller 
{ 
    private readonly UnitOfWork _unitOfWork; 

    private ApplicationUserManager _userManager 
    { 
     get { return HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } 
    } 
} 

因此,我得到兩個背景:首先是從GetOwinContext()IOwinContext,第二個是我的正常ApplicationContext,創建(或正在創造?)在「工作單位」。這種情況會導致異常。

任何人都可以建議我,在這種情況下什麼是最好的?我爲編寫ApplicationUser的資源庫而戰鬥,但我從未在文章中看到過這種做法,所以我不確定。

+0

以顯而易見的開始。 ApplicationUser是否在一個上下文中(如默認的IdentityDbContext),並且是在另一個像ApplicationContext中聲明的Order?那會導致你的錯誤。如果是這樣,只要讓你的ApplicationContext從IdentityDbContext繼承。 –

+0

@SteveGreene不,我的'ApplicationContext'已經從'IdentityDbContext '繼承了。實際上,我有兩種情況是由兩種不同的方式創建的,並且會導致錯誤。問題是我不知道如何在沒有ApplicationUserManager的情況下與用戶一起工作,就我所見,它不能用ApplicationContext進行初始化。 – QuarK

+1

如果您只是引用用戶,則不需要UserManager。例如,'ApplicationUser myUser = context.Users.FirstOrDefault(u => u.Id == myUserId);'將獲取身份用戶。如果您要更改密碼等,您需要使用UserManager。顯示相關的存儲庫代碼。 –

回答

1

第一種方式解釋: 根據你的錯誤消息,因爲據我所知,這也許是當你改變背景下的結構,但可以更新數據庫,所以我建議你需要更新數據庫保存之前。

您可以使用數據庫遷移命令而不改變數據對數據庫進行更新,你有如下: 進入工具 - >庫包管理器 - >程序包管理器控制檯, 運行包管理器啓用的遷移命令控制檯, 添加遷移, 更新的數據庫, 添加遷移(您的項目)

方式二說明: IOwinContext接口:這個包OWIN環境字典,並提供強類型的訪問器。 帶有HttpContext的GetOwinContext接口:獲取當前請求的IOwinContext。 使用Http請求的GetOwinContext接口:獲取當前請求的IOwinContext。通過Repository模式

Public ApplicationContext:DbContext 
{ 
Public ApplicationContext():base(「ConnectionStringName」) 
{ 
Database.SetInitializer<ApplicationContext>(null); 
} 
//Dbsets here 
} 

當我們試圖保存不同的順序在這種情況下,我們可以用第二個方案,如工作單位: 在ApplicationContext中的情況下,我們可以通過這種方式使用。這也是將數據從一個框架轉移到另一個框架的靈活方式。

+0

第一種方法:不,我沒有改變我的實體。可以肯定的是,我運行「Add-Migration」,它生成空的「Up()」和「Down()」。第二種方式:我已經使用過這樣的上下文,而且'DbContext'不適合具有單獨用戶認證的應用程序。必須使用'IdentityDbContext '而不是它。 – QuarK

+0

如果上下文結構發生變化,則消息是:「自從創建數據庫以來,支持'ContextName'上下文的模型已經發生了變化。考慮使用Code First Migrations來更新數據庫」 – QuarK

+1

這個答案沒有意義。問題是你有一個更新的上下文,而不是你的模型不同步。 –