【问题标题】:Modeling a non-primary Key relationship建模非主键关系
【发布时间】:2015-03-25 10:37:47
【问题描述】:

我正在尝试为以下关系建模,目的是首先为 EF 代码设计类。

Program表:

ProgramID - PK  
ProgramName  
ClusterCode  

样本数据

ProgramID   ProgramName   ClusterCode  
--------------------------------------
    1       Spring            A  
    2       Fall              A  
    3       Winter            B  
    4       Summer            B  

Cluster表:

ID  
ClusterCode  
ClusterDetails  

样本数据:

ID   ClusterCode   ClusterDetails
---------------------------------
 1       A              10  
 2       A              20  
 3       A              30  
 4       B              20  
 5       B              40  

我需要将Program 表加入Cluster 表,以便获取每个程序的集群详细信息列表。

SQL 将是

Select   
from Programs P
Join Cluster C On P.ClusterCode = C.ClusterCode  
Where P.ProgramID = 'xxx'

请注意,对于Program 表,ClusteCode 不是唯一的。

对于Cluster 表,ClusterCodeClusterDetail 都不是唯一的。

我将如何对此进行建模,以便我可以利用导航属性和代码优先?

【问题讨论】:

  • 请添加语言标签(C# 或 VB.NET 或 ets),最好显示上面 2 个表映射的类
  • 所以这不会回答你的问题,但这似乎更像是一个数据库设计问题,而不是用 EF 解决的问题。为什么不将 Program 表的 ClusterCode 字段替换为 ClusterID 字段,作为 Cluster 表的外键?

标签: sql-server entity-framework ef-code-first data-modeling


【解决方案1】:

假设您已经映射了两个表并在它们之间建立了关联并且您正在使用C#,您可以使用简单的join

List<Sting> clustedDets=new ArrayList<String>(); 

var q = 
    from p in ClusterTable
    join c in Program on p equals c.ClusterTable
    select new { p.ClusterDetails }; 

foreach (var v in q) 
{ 
    clustedDets.Add(v.ClusterDetails);  
} 

【讨论】:

  • 好的,但是有没有办法对此进行建模以利用导航属性?
  • 因为我没有看到您的表之间的任何 PK/FK 关系以及您的实体之间基于它的任何关联,所以使用导航属性真的很难,我也不确定我的 linq 查询如果没有,是否会起作用,因此您必须根据如何在实体之间建立关系进行一些更改,祝您好运。
  • 看起来这将是要走的路。我首先是 EF 和 Code 的新手,并试图弄清楚这是否可能。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多