2014-05-15 70 views
1

正如標題所說我使用新C#MVC 5Identity做一個簡單的電話:身份UserManager.AddToRole拋出異常

UserManager.AddToRole(User.Id, User.RequestedRole); 

我在我ViewModel的方法是從Controller

叫這樣做

UserManager中的Base Class創建了ViewModel這樣的:

UserManager = new UserManager<TMUser>(new UserStore<TMUser>(new TMContext())); 

當我作出上述呼籲AddToRole方法,我得到這個Inner Exception(外一種是通用/沒用):

{"A relationship from the 'Ledger_User' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Ledger_User_Source' must also in the 'Deleted' state."} 

我顯然不是刪除所有東西,但只增加一個角色,我的用戶。當我試圖混合來自多個上下文的對象時,我有過這個異常......但我在這裏沒有這樣做...請幫忙。

編輯: 我在它被幹擾的情況下襬脫了模型,並添加以下代碼到我的控制器:

public ActionResult UpdateRoles(string id) 
    { 
     if (ModelState.IsValid) 
     { 
      var userManager = new UserManager<TMUser>(new UserStore<TMUser>(new TMContext())); 
      var userRequestingRole = userManager.FindById(id); 

      if (!userManager.IsInRole(userRequestingRole.Id, userRequestingRole.RequestedRole)) 
       userManager.AddToRole(userRequestingRole.Id, userRequestingRole.RequestedRole); 

      // It is still crashing with the same error in the above AddToRole 
     } 

如需進一步信息,這裏是我TMUser的結構和Ledger對象:

public class TMUser : IdentityUser 
{ 
    public TMUser() 
    { 
     Ledger = new Ledger(); 

     OrderHistory = new List<Order>(); 

     Clients = new List<Client>(); 

     IsActive = true; 
    } 

    [DisplayName("Full Name")] 
    public string FullName { get; set; } 

    [DisplayName("Notification Email")] 
    public string NotificationEmail { get; set; } 

    public virtual Ledger Ledger { get; set; } 

    public virtual List<Order> OrderHistory { get; set; } 

    public virtual List<Client> Clients { get; set; } 

    public string RequestedRole { get; set; } 

    public virtual TMUser RoleApprovedBy { get; set; } 

    public bool IsActive { get; set; } 
} 

public class Ledger 
{ 
    public Ledger() 
    { 
     Transactions = new List<Transaction>(); 
    } 

    public long Id { get; set; } 

    [Required] 
    public virtual TMUser User { get; set; } 

    public virtual List<Transaction> Transactions { get; set; } 

    public decimal GetBalance() 
    { 
     // ... 
    } 

    internal void AddTransaction(decimal amount, string description, Order order) 
    { 
     // ... 
    } 
} 

另一個編輯: 今天是另一個˚F生鏽的一天。在對我的Context進行了一些更改後,它最初看起來像我解決了這個問題。下面是我所做的更改:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<TMUser>().HasOptional(c => c.RoleApprovedBy); 

    modelBuilder.Entity<TMUser>().HasOptional(c => c.Ledger); 
} 

我添加了上述的DB Context類,我的是:public class TMContext : IdentityDbContext<TMUser>

這工作的第一次,我一定打破某種關聯呢?然而,當我使用不同的用戶,類似的再次嘗試,但略有不同Exception發生了:

{"A relationship from the 'TMUser_Ledger' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'TMUser_Ledger_Target' must also in the 'Deleted' state."} 

所以感覺就像我回到了起點......我可以通過從該Ledger繼續下去User對象,但這將是作弊...我真的不想得到它的黑客...請幫助...

回答

2

問題是,你在TMUser的構造函數中創建一個新的Ledger,當您這樣做時,您將刪除TMUser的當前分類帳並將其替換爲新的空賬分類賬。然後,EF會將新分類帳作爲需要插入數據庫的新對象處理。這就是爲什麼你得到關於被刪除狀態的實體的驗證錯誤。

在TMUser的構造函數中創建新分類帳的另一件事情是,每個TMUser都有一個分類帳,但在數據庫模型中,您已將其設置爲空(由於HasOptional)。

+0

完美的感覺,現在你解釋它...感覺就像在這一點上......感謝 –

+0

告訴這是有道理的是胡說八道。任何正常的ORM(NHibernate)將創建該對象,然後設置它從數據庫加載的所有數據。 如果你想有一個對象模型,你不希望總是檢查是否有null(你決定這些對象必須存在,即使它們可能不在數據庫中),上面的場景是必需的。 對於任何正在進行面向對象編碼的人來說,這是一個真正的挑戰,因此:「萬歲,EF再次做到這一點」。 技巧:我使用受保護的默認ctor()[這是由EF使用]然後靜態創建方法,在我的代碼中使用,我可以設置這些對象。 – baHI