Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架(代码优先)-一对多关系_Entity Framework_Entity Framework Core_Ef Code First - Fatal编程技术网

Entity framework 实体框架(代码优先)-一对多关系

Entity framework 实体框架(代码优先)-一对多关系,entity-framework,entity-framework-core,ef-code-first,Entity Framework,Entity Framework Core,Ef Code First,我在EF(.net Core)6中设置一对多关系时遇到问题 我有一张有用户的桌子 public class UserDomain{ Id{get;set;} Name{get;set;} } 我有一个包含消息的表,我想在其中跟踪谁看到了消息 public class MessageDomain{ Id{get;set;} Title{get;set;} Message{get;set;} List<UserDomain> UsersRead{get;se

我在EF(.net Core)6中设置一对多关系时遇到问题

我有一张有用户的桌子

public class UserDomain{
   Id{get;set;}
   Name{get;set;}
}
我有一个包含消息的表,我想在其中跟踪谁看到了消息

public class MessageDomain{
  Id{get;set;}
  Title{get;set;}
  Message{get;set;}
  List<UserDomain> UsersRead{get;set;}
}
公共类MessageDomain{
Id{get;set;}
标题{get;set;}
消息{get;set;}
List UsersRead{get;set;}
}
现在,当我添加迁移时,它会在用户表上设置一列,其中包含消息id的整数。但这不是我想要的。因为每次我将消息设置为已读时,读取消息都会切换

我试过了

modelBuilder.Entity<MessageDomain>().HasMany(x => x.UsersRead).WithOne().HasForeignKey(x => x.Id);
modelBuilder.Entity().HasMany(x=>x.UsersRead).WithOne().HasForeignKey(x=>x.Id);

但这也不起作用。

为了建立一对多关系,您必须拥有该列,该列将是另一个表的FK

在您的情况下,if
MessageDomain
需要与多个用户建立关系。 您需要在
UserDomain
类中添加
MessageDomainId
列它还将在数据库中生成该列

但这不是我想要的。因为每次我将消息设置为已读时,读取消息都会切换


每次发生这种情况时,您必须更新
UserDomain
上的引用

,为了建立一对多关系,您必须将该列作为另一个表的FK

在您的情况下,if
MessageDomain
需要与多个用户建立关系。 您需要在
UserDomain
类中添加
MessageDomainId
列它还将在数据库中生成该列

但这不是我想要的。因为每次我将消息设置为已读时,读取消息都会切换


每次发生这种情况时,您都必须更新
UserDomain
上的引用

,根据上面对答案的评论,您可能需要创建一个额外的表

  • 用户域
  • 用户消息
  • 消息域
  • 其中,用户将与UserMessages建立一对多关系,然后MessagesDomain将与UserMessages建立一对多关系

    public class UserDomain
    {
       Id{get;set;}
       Name{get;set;}
       List<UserMessages> ReadMessages{get;set;}
    }
    
    public class UserMessages
    {
       UserId{get;set;}
       MessageId{get;set;}
       MessageDomain MsgDomain{get;set;}
       UserDomain UserDomain{get;set;}
    }
    
    public class MessageDomain{
      Id{get;set;}
      Title{get;set;}
      Message{get;set;}
      List<UserMessages> ReadBy{get;set;}
    }
    
    公共类用户域
    {
    Id{get;set;}
    名称{get;set;}
    列出读取消息{get;set;}
    }
    公共类用户消息
    {
    用户标识{get;set;}
    MessageId{get;set;}
    MessageDomain MsgDomain{get;set;}
    用户域用户域{get;set;}
    }
    公共类消息域{
    Id{get;set;}
    标题{get;set;}
    消息{get;set;}
    列表ReadBy{get;set;}
    }
    

    然后,您将使用UserMessages跟踪哪个用户阅读了哪个消息,然后您可以在查询中包含相关表以获取所有数据。

    根据上面答案上的注释,您可能需要创建一个附加表

  • 用户域
  • 用户消息
  • 消息域
  • 其中,用户将与UserMessages建立一对多关系,然后MessagesDomain将与UserMessages建立一对多关系

    public class UserDomain
    {
       Id{get;set;}
       Name{get;set;}
       List<UserMessages> ReadMessages{get;set;}
    }
    
    public class UserMessages
    {
       UserId{get;set;}
       MessageId{get;set;}
       MessageDomain MsgDomain{get;set;}
       UserDomain UserDomain{get;set;}
    }
    
    public class MessageDomain{
      Id{get;set;}
      Title{get;set;}
      Message{get;set;}
      List<UserMessages> ReadBy{get;set;}
    }
    
    公共类用户域
    {
    Id{get;set;}
    名称{get;set;}
    列出读取消息{get;set;}
    }
    公共类用户消息
    {
    用户标识{get;set;}
    MessageId{get;set;}
    MessageDomain MsgDomain{get;set;}
    用户域用户域{get;set;}
    }
    公共类消息域{
    Id{get;set;}
    标题{get;set;}
    消息{get;set;}
    列表ReadBy{get;set;}
    }
    

    然后,您将使用UserMessages跟踪哪个用户阅读了哪个消息,然后您可以在查询中包含相关表以获取所有数据。

    可能问错了,但我有多条消息,希望知道哪个用户查看了消息。通过在userDomain中添加MessageDomainId,我只能跟踪1条消息(该列中的id)。可能询问错误,但我有多条消息,希望知道哪个用户查看了该消息。通过在userDomain中添加MessageDomainId,我只能跟踪1条消息(该列中的id)。