【问题标题】:Entity Framework class instantiation behavior实体框架类实例化行为
【发布时间】: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=&lt;value&gt;, Title = &lt;value&gt;} 而不是将每个属性传递给ctor并设置所需的属性。
  • 发布此 UserManager.FindById() 正在做什么以及正在初始化 dbContext 的位置的代码。
  • userManager.FindById() 是微软提供的身份框架的默认方法,该类的代码可在线获取。我真的不认为问题出在微软代码上,否则交付一个乱七八糟的框架代码会很笨拙。

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

您没有任何外键来链接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);

【讨论】:

  • 你现在遇到了什么错误?发布错误详细信息,这可能有助于查明实际问题。 ApplicationUser 是否也配置在同一个 DbContext 类中?
  • 我得到的错误在线:> UserManager.Update(addedUser);它说违反实体框架约束,关系(Qwirk.Models.Notification_AssociatedUser)的角色(Notification_AssociatedUser_Target)的多重性是1或0..1正如我之前所说的,当我实例化一个新通知时,应用程序只是持续变化并且已经在通知表上创建了该行,因此实际上,一旦我尝试将该通知实例添加到用户“ addedUser”,它似乎试图在通知表上创建另一行,这会导致问题
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多