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

问题描述 投票:0回答:2

我在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;}
}

现在,当我添加迁移时,它将在用户表上设置一列,其中包含消息ID的整数。但这不是我想要的。因为这样,每次我将邮件设置为已读时,已读邮件都会切换。

我尝试过

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

但是那也不起作用。

entity-framework entity-framework-core ef-code-first
2个回答
0
投票

为了具有一对多关系,您必须具有该列,该列将成为另一张表的FK。

在您的情况下,如果MessageDomain需要与许多用户建立关系。您需要在MessageDomainId类中添加UserDomain列。 -它也会在数据库中生成该列。

但是那不是我想要的。因为这样,每次我将邮件设置为已读时,已读邮件都会切换。

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


0
投票

基于对以上答案的评论,您可能需要创建一个附加表。

  1. UserDomain
  2. UserMessages
  3. MessagesDomain

其中用户将与UserMessages具有一对多关系,然后MessagesDomain将与UserMessages具有一对多关系。

public class UserDomain
{
   Id{get;set;}
   Name{get;set;}
}

public class UserMessages
{
   UserId{get;set;}
   MessageId{get;set;}
}

public class MessageDomain{
  Id{get;set;}
  Title{get;set;}
  Message{get;set;}
  List<UserDomain> UsersRead{get;set;}
}

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

© www.soinside.com 2019 - 2024. All rights reserved.