2017-06-19 76 views
0

我面临一个问题,当我试图实例化任何类时,我的实体框架保持行为怪异。我正尝试使用默认的用户管理器行为将数据存储在我的数据库中。在将通知添加到应用程序用户类中可用的通知列表之前,我开始实例化新通知后,它会保留这些更改并处理来自实体框架的错误,指出存在多重性问题,如何告知实体框架不坚持变化一次,我在这里实例化一个类CF是我的控制器代码:实体框架类实例化行为

public string AddFriend(string AddedUserId) 
{ 
    var AddedUser = UserManager.FindById(AddedUserId); 
    var AddingUser = UserManager.FindById(User.Identity.GetUserId()); 
    var friendship = new Friend(AddingUser, AddedUser) { IsInvitation = true }; 
    AddingUser.Friends.Add(friendship); 
    AddedUser.Notifications.Add(new Notification(AddingUser, "Friend Invitation", 
        "The user " + AddingUser.FirstName + " " + AddingUser.LastName + 
        " Sent you a friend invitation", friendship)); 
    UserManager.Update(AddedUser); 
    UserManager.Update(AddingUser); 
    return "Friend was added successfully"; 
} 

我Notification类:

[Table("Notifications")] 
public class Notification 
{ 
    [Key] 
    public int NotificationId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    [Required] 
    public ApplicationUser AssociatedUser { get; set; } 
    public Friend AssociatedFrienship { get; set; } 
    public GroupMember AssociatedGroup { get; set; } 
    public ChannelMember AssociatedChannel { get; set; } 
    public Message AssociatedMessage { get; set; } 
    public bool Consulted { get; set; } 

    public Notification() 
    { 
    } 

    public Notification(ApplicationUser associatedUser, string title, string content, Friend associatedFriend = null, GroupMember associatedGroup = null, ChannelMember associatedChannel = null, Message associatedMessage = null) 
    { 
     AssociatedUser = associatedUser; 
     Title = title; 
     Content = content; 
     AssociatedChannel = associatedChannel; 
     AssociatedGroup = associatedGroup; 
     AssociatedFrienship = associatedFriend; 
     AssociatedMessage = associatedMessage; 
     Consulted = false; 
    } 
} 

我ApplicationUser类:

public partial class ApplicationUser : IdentityUser 
{ 
    public virtual List<Notification> Notifications { get; set; } 
} 

我FluentAPI代码:

modelBuilder.Entity<Notification>() 
      .HasRequired(c => c.AssociatedUser) 
      .WithMany(c => c.Notifications); 

提前感谢!

+0

其他的事情,请尝试使用'串interpolation'而不是'+'是这样的:'$“的用户{AddingUser.FirstName} { AddingUser.LastName}发送给你一个朋友邀请“'也可以使用'Object Initialization'这样的'new Notification {AssociatedUser = ,Title = }'来代替将每个属性传递给'ctor',并设置所需的属性。 – TheVillageIdiot

+0

发布此UserManager.FindById()正在执行的操作以及dbContext正在初始化的位置的代码。 –

+0

userManager.FindById()是微软提供的身份框架的默认方法,该类的代码可在线使用。我真的不认为问题来自微软的代码,其他人认为提供一个混乱的框架代码会很糟糕。 –

回答

0

您没有任何可连接的外键AssociatedUser。尝试添加一个属性以使用外键将Notification链接到ApplicationUser。像

public class Notification 
{ 
    //rest of properties 

    //change int to whatever type your primary key is in 
    //ApplicationUser class. I have Guid for example. 
    public int ApplicationUser AssociatedUserId {get;set;} 
} 

然后尝试修改这样的配置:除了

modelBuilder.Entity<Notification>() 
     .HasRequired(c => c.AssociatedUser) 
     .WithMany(c => c.Notifications) 
     .HasForeignKey(n=>n.AssociatedUserId); 
+0

这实际上并没有解决问题 –

+0

你现在得到了什么错误?发布错误详情,这可能有助于查明实际问题。 'ApplicationUser'是否也在相同的'DbContext'类中配置? – TheVillageIdiot

+0

我得到的错误是:> UserManager.Update(addedUser); 它说实体框架约束违反,关系(Qwirk.Models.Notification_AssociatedUser)的角色的多重性(Notification_AssociatedUser_Target)是1或0..1 正如我之前说过的,它似乎是当我instanciate一个新的通知应用程序只是坚持更改并已经在通知表上创建该行,所以作为一个效果,一旦我尝试将该通知的实例添加到用户“addedUser”,似乎它会尝试在通知表上创建另一行,从而导致问题 –