2017-06-18 52 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