使用 Identical/Similar 模式和 Entity Framework 处理许多表
Dealing with Many Tables with Identical/Similar Schemas AND Entity Framework
我们有一个有趣的要求,许多带有文本的 table 必须以用户为其安装配置的所有语言提供这些值(我们不支持从右到左文本)。这是一个 ASP.NET MVC 网络应用 Entity Framework.
通常,这些是客户管理的 lookup/dropdown 列表,他们需要能够查看各种屏幕和 select 显示的语言(我什至还没有谈论标签文本) )
我通常会有一堆(在这种情况下是几十个)tables 这种布局:
ID int PK,
Display nvarchar(100),
<other stuff>
我现在有 2 个 tables:
Master Table
ID int PK,
<other stuff>
Language Table
ID int PK FK to corresponding master table
LangID int PK FK to table of implements languages
Display nvarchar(100)
假设我有 3 种语言和一个包含 4 行的 OptionA table,我最终得到:
选项 A - 4 行
OptionA_L - 12 行
...然后我得到了 ~60 对 table。
所有 *_L table 都有相同的核心栏(以上),有些可能有额外的文本栏(注释、备用名称等)。
首先,*_L 概念不是一成不变的 - 它只是我到目前为止提出的。
其次,我们正在使用 Entity Framework 6,数据库优先。如果我们只是构建 SQL 语句并且可以用文本替换 table 名称,那么这些 table 将相当容易处理。我看到你可以通过 EF 执行 SQL,但它是有限的,在这里没有帮助。另外,我宁愿做一些更优雅的事情。我认为通用接口会有所帮助,但我还没有想出如何做。所以我有很多重复的代码和一些巨大的 switch 语句。
所以,具体来说:
schema/*_L方案是否合理? (抛开要求的合理性!)
我的 SQL2008/2012 知识非常肤浅 - table 文章和专栏等等。它的 XML 或 CLR 支持对我有任何帮助吗?
似乎我应该能够利用接口或泛型 - 但在 EF 数据上下文的上下文中这样做却让我望而却步。这里有什么想法吗?
看来你想要Table Per Type
我经常使用一个抽象基class来为每个table添加Id列。
public abstract class BasicBo
{
public virtual int Id {get;set;
}
public class Thing :BasicBo
{
// other properties.
}
public class MyDbContext( string connectionString) : base(connectionString)
{
public DbSet<Thing> Things { get;set;}
// etc
}
我们有一个有趣的要求,许多带有文本的 table 必须以用户为其安装配置的所有语言提供这些值(我们不支持从右到左文本)。这是一个 ASP.NET MVC 网络应用 Entity Framework.
通常,这些是客户管理的 lookup/dropdown 列表,他们需要能够查看各种屏幕和 select 显示的语言(我什至还没有谈论标签文本) )
我通常会有一堆(在这种情况下是几十个)tables 这种布局:
ID int PK,
Display nvarchar(100),
<other stuff>
我现在有 2 个 tables:
Master Table
ID int PK,
<other stuff>
Language Table
ID int PK FK to corresponding master table
LangID int PK FK to table of implements languages
Display nvarchar(100)
假设我有 3 种语言和一个包含 4 行的 OptionA table,我最终得到: 选项 A - 4 行 OptionA_L - 12 行
...然后我得到了 ~60 对 table。
所有 *_L table 都有相同的核心栏(以上),有些可能有额外的文本栏(注释、备用名称等)。
首先,*_L 概念不是一成不变的 - 它只是我到目前为止提出的。
其次,我们正在使用 Entity Framework 6,数据库优先。如果我们只是构建 SQL 语句并且可以用文本替换 table 名称,那么这些 table 将相当容易处理。我看到你可以通过 EF 执行 SQL,但它是有限的,在这里没有帮助。另外,我宁愿做一些更优雅的事情。我认为通用接口会有所帮助,但我还没有想出如何做。所以我有很多重复的代码和一些巨大的 switch 语句。
所以,具体来说:
schema/*_L方案是否合理? (抛开要求的合理性!)
我的 SQL2008/2012 知识非常肤浅 - table 文章和专栏等等。它的 XML 或 CLR 支持对我有任何帮助吗?
似乎我应该能够利用接口或泛型 - 但在 EF 数据上下文的上下文中这样做却让我望而却步。这里有什么想法吗?
看来你想要Table Per Type
我经常使用一个抽象基class来为每个table添加Id列。
public abstract class BasicBo
{
public virtual int Id {get;set;
}
public class Thing :BasicBo
{
// other properties.
}
public class MyDbContext( string connectionString) : base(connectionString)
{
public DbSet<Thing> Things { get;set;}
// etc
}