【发布时间】:2017-06-19 22:49:50
【问题描述】:
我面临一个问题,当我尝试实例化任何类时,我的实体框架总是表现得很奇怪。我正在尝试使用默认的 usermanager 行为将数据存储在我的数据库中。一旦我在将新通知添加到应用程序用户类中可用的通知列表之前开始实例化一个新通知,它就会保留这些更改并处理来自实体框架的错误,指出存在多重性问题,我如何告诉实体框架不要一旦我实例化了一个类,就持续更改这里是我的控制器代码:
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";
}
我的通知类:
[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);
提前致谢!
【问题讨论】:
-
除此之外,尝试使用
string interpolation而不是+像这样:$"The user {AddingUser.FirstName} {AddingUser.LastName} Sent you a friend invitation"也可以使用Object Initialization像这样new Notification{ AssociatedUser=<value>, Title = <value>}而不是将每个属性传递给ctor并设置所需的属性。 -
发布此 UserManager.FindById() 正在做什么以及正在初始化 dbContext 的位置的代码。
-
userManager.FindById() 是微软提供的身份框架的默认方法,该类的代码可在线获取。我真的不认为问题出在微软代码上,否则交付一个乱七八糟的框架代码会很笨拙。
标签: c# asp.net asp.net-mvc entity-framework