我有一个参考表,其中包含性别,地址类型,联系人类型等各种受控值查找数据。许多表都有多个外键到此参考表
我还有多对多关联表,它们有两个外键到同一个表。不幸的是,当这些表被拉入Linq模型并生成DBML时,SQLMetal不会查看外键列的名称或约束的名称,而只会查看目标表。所以我最终得到了名为Reference1,Reference2的成员......对维护不太友好。例如:
<Association Name="tb_reference_tb_account" Member="tb_reference" <======
ThisKey="shipping_preference_type_id" OtherKey="id" Type="tb_reference"
IsForeignKey="true" />
<Association Name="tb_reference_tb_account1" Member="tb_reference1" <======
ThisKey="status_type_id" OtherKey="id" Type="tb_reference"
IsForeignKey="true" />
当然,我可以进入DBML并手动更改成员名称,但这意味着我不能再遍历我的数据库架构。在模型的当前阶段,这不是一个选项,它仍在不断发展。 将参考表拆分为n个单独的表也是不可取的。
我可能会编写一个在每次生成后针对XML运行的脚本,并使用从ThisKey派生的内容替换成员名称(因为我遵守这些类型的键的命名约定)。 有人找到了解决这个问题的更好方法吗?
答案 0 :(得分:3)
所以我走了部分班级路线。例如,我添加了以下成员来解决原始示例中的第一个引用成员:
public partial class tb_account
{
public tb_reference shipping_preference_reference
{
get
{
return this._tb_reference.Entity;
}
set
{
this.tb_reference = value;
}
}
这远非完美。它需要大型模型中的大量额外代码,并且取决于属性的顺序不变(如果将参考表的另一个外键添加到帐户表中,该成员实际上可能指向除了运输偏好)。 也有好处。由于我已经为其他目的编写了部分类,因此添加这些成员并不需要重新构建应用程序。
答案 1 :(得分:3)
在VS2010中您实际上可以在视图中重命名父级和子级的属性。虽然它有点隐藏。
更多细节可以在这里找到: http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx
我从哪里得到它。
答案 2 :(得分:2)
当前用于LINQ的ms工具是有限的,并且看起来并不像2010年那样会有太大的努力。您可以编写自己的代码生成器,查看Damien's t4 templates或{{3} }。我还发现PLINQO可能值得一看。
答案 3 :(得分:0)
来自sqlmetal的我的xml有更明智的默认值。不完美,但更好。 第一个FK得到了表名,但第二个得到了字段名。
<Association Name="FK_Product_DefaultOutputTypeID" Member="OutputType"
ThisKey="DefaultOutputTypeID" OtherKey="OutputTypeID" Type="OutputType"
IsForeignKey="true" />
<Association Name="FK_Product_DefaultTileOutputTypeID" Member="DefaultTileOutputType"
ThisKey="DefaultTileOutputTypeID" OtherKey="OutputTypeID" Type="OutputType"
IsForeignKey="true" />
sqlmetal版本:
C:\Program Files\Microsoft Visual Studio 9.0\VC>sqlmetal /?
Microsoft (R) Database Mapping Generator 2008 version 1.00.21022
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.
...