gpt4 book ai didi

asp.net-mvc - Code First 中的一对多关系

转载 作者:行者123 更新时间:2023-12-02 00:29:09 25 4
gpt4 key购买 nike

我想在 UsersNotifications 之间创建一种关系,我认为这是一种一对多关系。

我在这方面遇到了麻烦,并且不确定我是怎么出错的。这是两个类的代码:

public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }

public virtual ICollection<Notification> Notifications { get; set; }
}

public class Notification
{
public int NotificationID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime Time { get; set; }

public string ApplicationUserID { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}

我还有以下映射:

modelBuilder.Entity<Notification>()
.HasRequired<ApplicationUser>(u => u.ApplicationUser)
.WithMany(u => u.Notifications)
.HasForeignKey(u => u.NotificationID);

我在尝试修复此问题时遇到了不同的错误,例如:

  • 多重性无效
  • 违反了多重性约束。关系 _ 的角色 _ 的重数为 1 或 0..1

编辑:

当我尝试为所有用户添加通知时,会抛出相同的异常(违反了多重性约束。关系Notification_ApplicationUser'的角色'Notification_ApplicationUser_Target'具有多重性1或0..1。) :

public void AddNotification(Notification n)
{
var roleId = context.Roles.Where(m => m.Name == "User").Select(m => m.Id).SingleOrDefault();
var users = context.Users.Where(u => u.Roles.All(r => r.RoleId == roleId)).ToList();
try
{
foreach(var user in users)
{
user.Notifications.Add(n);
}
context.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}

最佳答案

我认为问题出在外键的字符串类型上。默认情况下,字符串在数据库级别可为空,但所需的外键不能为空。指定 HasRequired 仅强制要求该关系是必需的,而不强制外键属性必须不为空。我认为如果您只需将 [Required] 添加到外键属性中,就可以解决问题:

[Required]
public string ApplicationUserID { get; set; }

显然,您需要进行迁移才能将此更改应用到您的数据库。

编辑

抱歉,我读错了异常。问题的根源实际上是向每个用户添加相同的通知,就像字面上相同的通知一样。 EF 进行对象跟踪,因此在添加一次 n 引用的实体实例后,EF 就会对其进行跟踪。然后,当您尝试将其添加到另一个用户时,它会认为您正在尝试执行多对多操作,基本上,单个 Notification 记录将属于多个用户。

在我的脑海中,我不确定在 EF 中解决这种困惑的最佳方法是什么,但我有一些潜在的想法:

  1. 您可以在添加实体后尝试分离该实体:

    user.Notifications.Add(n);
    context.Entry(n).State = EntityState.Detached;

    但是,我不确定这是否允许添加它。你必须进行测试。如果没有创建它,您也可以尝试在分离之前保存。我认为这可行,但每次迭代都提交到数据库显然效率很低。

  2. 最安全的方法是为每个实例创建一个新实例,然后简单地映射 n 中的数据:

    var notification = new Notification
    {
    Title = n.Title,
    Description = n.Description,
    Time = n.Time
    };
    user.Notifications.Add(notification);

    这将确保您添加的每个通知都是完全独立的跟踪实例。

关于asp.net-mvc - Code First 中的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43076682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com