2017-06-18 50 views
0

實體框架的關係我工作用ASP和實體框架和身份的網站上。與身份

我實際上面臨一個問題,即實體框架不向數據庫表中添加條目,即使我正在向模型中添加類。

我面臨的只是實際問題打我宣佈爲以下身份模型至極的具體subclasse:

public partial class ApplicationUser : IdentityUser 
{ 
      public virtual List<Friend> Friends { get; set; } 
} 

朋友那裏被聲明爲以下幾點:

[Table("Friends")] 
public class Friend 
{ 
    [Key, Column(Order = 1)] 
    public string AddingUser { get; set; } 
    [Key, Column(Order = 2)] 
    public string AddedUser { get; set; } 

    public string Pseudo { get; set; } 
    public DateTime FriendsSince { get; set; } 
    public bool IsInvitation { get; set; } 
    public bool IsAccepted { get; set; } 
    public bool IsBloqued { get; set; } 
    public int NumberOfUnreadenMessages { get; set; } 

    public virtual List<Message> FriendShipMessages { get; set; } 
    [ForeignKey("AddingUser")] 
    public virtual ApplicationUser AddingFriend { get; set; } 
    [ForeignKey("AddedUser")] 
    public virtual ApplicationUser AddedFriend { get; set; } 

    public Friend() 
    { 
     FriendShipMessages = new List<Message>(); 
    } 

    public Friend(ApplicationUser AddingUser, ApplicationUser AddedUser) 
    { 
     AddedFriend = AddedUser; 
     AddingFriend = AddingUser; 
     this.AddingUser = AddingUser.Id; 
     IsInvitation = false; 
     IsAccepted = false; 
     IsBloqued = false; 
     FriendsSince = DateTime.Now; 
     NumberOfUnreadenMessages = 0; 
     FriendShipMessages = new List<Message>(); 
    } 
} 

我做添加到EF模型構建器此規則以將應用程序用戶映射到朋友表:

// Mapping Friends And Bloqueds 
modelBuilder.Entity<ApplicationUser>() 
    .HasMany(c => c.Friends) 
    .WithRequired(c => c.AddingFriend) 
    .WillCascadeOnDelete(false); 

在我的控制器部分增加一個用戶,我使用下面的代碼:

public string AddFriend(string AddedUserId) 
{ 
    var AddedUser = UserManager.FindById(AddedUserId); 
    var AddingUser = UserManager.FindById(User.Identity.GetUserId()); 
    AddingUser.Friends.Add(new Friend(AddingUser, AddedUser) { 
      IsInvitation = true }); 
    return "Friend was added successfully"; 
} 

哪裏是爲什麼我的控制器不能有效地將知道在調試運行會話我確實有良好的實體進入到數據庫的問題進入控制器,它也可以有效地創建好友類的實例。 預先感謝您的回覆。

+0

首先,您並未在任何地方保存更改。你應該真的用'DbContext'做這種事情,而不是'UserManager'返回的用戶對象。 – DavidG

+0

我傳遞到的UserManager當我創建一個全局DB背景下,是不是已經走在帳戶中的更改,並將它們直接存儲到數據庫? 在ConfigureAuth從Owin我有: app.CreatePerOwinContext (ApplicationUserManager.Create); –

+1

我真的不知道了'UserManager'是如何工作的,當您更改集合屬性,我希望還是明確有這樣的事情這就是爲什麼我會直接使用的上下文。它可能工作,如果你實際上更新用戶(即'UserManager.UpdateUser(AddingUser)'),否則你不堅持你的更改。 – DavidG

回答

0

更改實體對象沒有得到保存到數據庫中,直到你真正告訴你的情況下做到這一點。我的首選的這種方法是使用上下文,而不是直接的UserManager

var addedUser = db.Users.Single(u => u.Id == addedUserId); 
var addingUser = db.Users.Single(u => u.Id == User.Identity.GetUserId()); 

addingUser.Friends.Add(new Friend(addingUser, addedUser) 
{ 
    IsInvitation = true; 
}); 

db.SaveChanges(); 

但是這可能工作(我假設UserManager電話db.SaveChanges內部),如果你真的想使用UserManager

var addedUser = UserManager.FindById(addedUserId); 
var addingUser = UserManager.FindById(User.Identity.GetUserId()); 

addingUser.Friends.Add(new Friend(addingUser, addedUser) 
{ 
    IsInvitation = true; 
}); 

UserManager.UpdateUser(addingUser); 

附註:我也改變了你的參數和變量的外殼,以配合共同約定。我強烈建議你這樣學習並堅持下去,特別是如果你打算與其他開發者合作。

+0

對於代碼常見約定,我應該總是用小寫字母開始一個變量,那就是你在談論約定時所談論的內容,還是其他的東西? –

+1

是的,變量和參數通常以小寫字母開頭。 – DavidG