实体框架与身份的关系

时间:2017-06-18 20:34:35

标签: c# asp.net entity-framework

我正在使用ASP和实体框架和身份在一个网站上工作。

我实际上遇到的问题是,实体框架不会在数据库表中添加条目,即使我正在向模型中添加类。

我面临的实际问题只是遇到身份模型的特定子类,我声明如下:

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";
}

问题出在哪里问题为什么我的控制器没有有效地添加数据库的条目知道在调试会话期间我确实有好的实体进入控制器并且它还有效地正确地创建了友元类的实例。

提前感谢您的回复。

1 个答案:

答案 0 :(得分: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);

旁注:我还更改了参数和变量的大小以匹配常规约定。我强烈建议学习这种方式并坚持使用它,特别是如果你打算与其他开发人员合作。