【问题标题】:Many-to-many relationship with three classes三个类的多对多关系
【发布时间】:2019-03-21 23:30:36
【问题描述】:

一开始我不得不说我不知道​​它是否一定是多对多的关系

假设我有三个类:

User-detalis,包含一些基本的用户信息,如地区、城市

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 与 Dictionary 和 Values 的信息:

 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 类中创建与实体框架(核心 2.0)的正确关系?

【问题讨论】:

  • 您可以让第三类充当 viewModel,它将包含 3 个属性 - UserDetails 的 ID、UserDetailsDictionary 的 ID 和您的布尔值,通过以这种方式存储 ID(它将作为外键工作),您可以非常容易地获取相应的详细信息
  • 它是一个网络应用(ASP.Net Core MVC)?
  • 它是 Web API,但它与业务逻辑和 DAL 层完全分离,所以我认为没关系。为什么应该让一些 viewModel 了解数据库架构?我的问题是关于如何在数据库中定义类以及如何将它们正确映射到实体框架
  • 对不起,我没有正确阅读您的第一条评论。是的,如果我的第三个类包含 userDetailsId、dictionaryItemId、值,它是非常简单的模型,我可以从 linq 手动查询它,但我也想从其他上下文中查询,比如从 userDetails 到 DictionaryItem(就像我在帖子中写的那样)和我也不知道如何将它映射到 EF,因为我不得不说 UserDetailsId 是 FK,DictionaryItemID 是 FK,并且这两个值都是表的 PrimaryKey

标签: c# sql .net entity-framework-core


【解决方案1】:

让我知道这是否适合你

我会建议你将这些表标准化为

1.] 第一个模型和表列

public class UserDetails
{
  public int UserId{get;set;}
  public string UserName{get;set;}
  public string City{get;set;}
  public strng Region{get;set;}
}

2.] 第二个模型和表格列

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();

您也可以将强类型模型作为 Json 返回,而不是匿名类型

【讨论】:

  • 感谢您的回答,但我知道这个解决方案(它是最简单的),但在我的代码中,我不想像这里那样使用联接。我想从 _dbContext.UsersDetails 访问 UserDetailsDictionary。或者我只是心情不好,我写的东西没有意义;)
  • 为此,您需要平面表而不是规范化表,您可以在其中存储实际值而不是 ID。比您可以直接从 _dbContext 查询而不使用 Joins 。但我会建议你使用 Normalize Tables 。它会让你免于很多头痛
猜你喜欢
  • 2011-08-10
  • 2021-05-16
  • 2015-08-19
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多