处理具有相同/相似模式和实体框架的许多表

时间:2015-09-04 18:41:47

标签: sql-server entity-framework-6 schema

我们有一个有趣的要求,即许多带文字的表必须以用户为其安装配置的所有语言提供这些值(而且我们不支持从右到左的文本)。它是一个带有Entity Framework的ASP.NET MVC Web应用程序。

通常,这些是客户管理的查找/下拉列表,他们需要能够查看各种屏幕并选择显示哪种语言(我甚至还没有谈论标签文本)

我通常会在这个布局中拥有一堆(在这种情况下为数十个)表:

ID int PK,
Display nvarchar(100),
<other stuff>

我现在有两张桌子:

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表,我最终得到:     OptionA - 4行     OptionA_L - 12行

......然后我就得到了约60个表对。

所有* _L表都有相同的核心列(上图),有些可能有其他文本列(注释,备用名称等)。

首先,* _L概念并非刻在石头上 - 这正是我迄今为止所提出的。

其次,我们正在使用Entity Framework 6,数据库优先。如果我们只是构建SQL语句并且可以用文本替换表名,那么这些表将非常容易处理。我看到你可以通过EF执行SQL,但它有限,在这里没有帮助。另外,我宁愿做一些更优雅的事。我认为一个共同的界面会有所帮助,但我还没弄清楚怎么样。所以我有很多重复的代码和一些巨大的切换语句。

所以,特别是:

  1. 架构/ * _ L计划是否合理? (除了要求的合理性!)

  2. 我的SQL2008 / 2012知识非常肤浅 - 表和列等等。它的XML或CLR支持是否以任何方式帮助我?

  3. 看起来我应该能够利用接口或泛型 - 但在EF数据上下文的上下文中这样做是我的意思。这里有什么想法?

1 个答案:

答案 0 :(得分:0)

似乎你想要Table Per Type

我经常使用抽象基类将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
}