C# 与三个类的多对多关系

C# 与三个类的多对多关系,c#,sql,.net,entity-framework-core,C#,Sql,.net,Entity Framework Core,首先,我不得不说,我不知道这是否一定是多对多关系 假设我有三个班: 用户详细信息,其中包含一些基本用户信息,如地区、城市 public class UserDetails { public int Id{get;set;} public string City{get;set;} public strng Region{get;set;} } 下一个类是UserDetailsDictionary public class UserDetailsDictionary { publ

首先,我不得不说,我不知道这是否一定是多对多关系

假设我有三个班:

用户详细信息,其中包含一些基本用户信息,如地区、城市

public class UserDetails
{
  public int Id{get;set;}
  public string City{get;set;}
  public strng Region{get;set;}
}
下一个类是UserDetailsDictionary

public class UserDetailsDictionary
{
  public int Id{get;set;}
  public string Name{get;set;}
  public string DetailsType{get;set;}
 }
此类将包含以下值:

Name = "football", detailsType="interests",
Name = "basketball", detailsType="interests",
Name = "brown", detailsType="eyes",
Name = "green", detailsType="eyes"
最后一个类应包含有关将userDetails与字典和值连接的信息:

 public class JoiningClass
   {
     public UserDetails UserDetails{get;set;}
     public UserDetailsDictionary DictionaryItem{get;set;}
     public bool Value{get;set;}
   }
该类中的值应如下所示:

(1,1,0)
(1,1,1)(first user like basketball)
(1,2,0)(first user does not have brown eyes)
(2,1,1) (second user likes football)
在代码中,我想从两个方面检查值,我的意思是:

UserDetailsDictionary type;
...
var val1 = _dbContext.UserDetails.Where(x=> x.DictionaryItem.Id == type.Id).Value;
从其他方面来说

UserDetails ud;
...
var allDetailsOfUser = _dbContext.UserDetailsDictionary.ToArray();
还有,假设我想找到所有棕色眼睛的用户(userDetails):

var dictionaryItem = _dbContext.UserDetailsDictionary.Where(x=>x.Name == "eyesColor").SingleOrDefault();

var userDetails = _dbContext.JoiningClass...?
我应该如何创建这些类?
如何在DbContext类中创建与实体框架(core 2.0)的正确关系?

请告诉我这是否适合您

我建议您将这些表标准化为

1.]第一个模型和表格列

public class UserDetails
{
  public int UserId{get;set;}
  public string UserName{get;set;}
  public string City{get;set;}
  public strng Region{get;set;}
}
public class UserDetailsDictionary
{
  public int DictId{get;set;}
  public string InterestName{get;set;}
  public string DetailsType{get;set;}
 }
2.]第二个模型和表格列

public class UserDetails
{
  public int UserId{get;set;}
  public string UserName{get;set;}
  public string City{get;set;}
  public strng Region{get;set;}
}
public class UserDetailsDictionary
{
  public int DictId{get;set;}
  public string InterestName{get;set;}
  public string DetailsType{get;set;}
 }
3.]存储数据的第三个表

public class UserData
{
  public int UserId{get;set;}
  public int DictonaryId{get;set;}
  public bool _value {get;set;}
 }
我假设数据存储在数据库中,正如您在问题中所示

(1,1,0)

(1,1,1)(第一个喜欢篮球的用户)

(1,2,0)(第一个用户没有棕色眼睛)

(2,1,1)(第二个用户喜欢足球)

现在让我们举一个例子

(2,1,1)(第二个用户喜欢足球)

ID为2的用户具有

大宗报价

对足球的兴趣(id为1的兴趣)

现在,您可以从api返回匿名类型

var m =(from data in _dbContext.UserData
Join details in _dbContext.UserDetails on data.UserID equals details.UserID
Join dict in _dbContext.UserDetailsDictionary on data.DictionaryID equals dict.DictID 
//where Condition if required 
select new {
UserName=details.UserName,
Interest= dict.IntersetName,
//_value=true/false 
}
).ToList();

除了Annonymous类型,您还可以将storngly类型模型返回为Json

您可以使用第三类act作为viewModel,它将包含3个属性—UserDetails的ID、UserDetailsDictionary的ID和您的bool值,通过这种方式存储ID(将用作外键)你可以很容易地获取相关的详细信息。这是一个web应用程序(ASP.Net Core MVC)?它是web API,但它与业务逻辑和DAL层完全分离,所以我认为这无关紧要。为什么一些视图模型需要了解数据库体系结构?我的问题是如何在数据库中定义类以及如何正确地将它们映射到实体框架。对不起,我还没有正确地阅读您的第一条评论。是的,如果我有第三个类包含userDetailsId,dictionaryItemId,value,这是一个非常简单的模型,我可以从linq手动查询,但是我还想从其他上下文进行查询,比如从userDetails到DictionaryItem(就像我在文章中写的),而且我不知道如何将其映射到EF,因为我不得不说userDetailsId是FK,DictionaryItemID是FK,这两个值都是Table的PrimaryKey谢谢你的回答,但是我知道这个解决方案(它是最简单的),但是在我的代码中,我不想像这里那样使用连接。我想从_dbContext.UsersDetails获取UserDetailsDictionary。或者我只是心情不好,我写的东西毫无意义;)为此,您需要平面表,而不是标准化表,其中存储的是实际值,而不是ID。这样,您就可以直接从_dbContext进行查询,而无需使用联接。但我建议您使用规范化表。它会使你免于很多头痛