使用 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 语句。

所以,具体来说:

  1. schema/*_L方案是否合理? (抛开要求的合理性!)

  2. 我的 SQL2008/2012 知识非常肤浅 - table 文章和专栏等等。它的 XML 或 CLR 支持对我有任何帮助吗?

  3. 似乎我应该能够利用接口或泛型 - 但在 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
}