我们有一个有趣的要求,即许多带文字的表必须以用户为其安装配置的所有语言提供这些值(而且我们不支持从右到左的文本)。它是一个带有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,但它有限,在这里没有帮助。另外,我宁愿做一些更优雅的事。我认为一个共同的界面会有所帮助,但我还没弄清楚怎么样。所以我有很多重复的代码和一些巨大的切换语句。
所以,特别是:
架构/ * _ L计划是否合理? (除了要求的合理性!)
我的SQL2008 / 2012知识非常肤浅 - 表和列等等。它的XML或CLR支持是否以任何方式帮助我?
看起来我应该能够利用接口或泛型 - 但在EF数据上下文的上下文中这样做是我的意思。这里有什么想法?
答案 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
}