【问题标题】:SQLMetal DataContext Associations Not Generated未生成 SQLMetal DataContext 关联
【发布时间】:2010-06-09 16:04:45
【问题描述】:

我正在为数据库生成 LINQ-to-SQL DataContext 和实体类。该数据库有几个表,其中两个是 - [AccountMaster] 和 [AccountCodes]。它们之间定义了外键关系,[AccountMaster].AccountNumber 被 [AccountCodes] 引用。

在 VS2008 中添加一个 LINQ-to-SQL 文件并将这些表拖到 DBML 设计视图中会在 AccountMaster 类中适当地生成一个 AccountNotes 集合。同时,使用 SQLMetal 生成 DataContext 不会产生任何 EntitySet 集合。

设计师输出:

[Table(Name="dbo.A01_AccountMaster")]
public partial class A01_AccountMaster //...
{
//...
    private long _AccountNumber;
    private EntitySet<A01aAccountNote> _A01aAccountNotes;
//...
}

SQLMetal 输出:

[Table(Name="dbo.A01_AccountMaster")]
[DataContract()]
public partial class A01_AccountMaster //...
{
//...
    private long _AccountNumber;
//...
}

我正在关注

的指南

http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx

我尝试先使用 SQLMetal 生成 DBML 文件,然后从生成的 DBML 生成 DataContext.cs 文件:

sqlmetal.exe /server:srv /database:db /user:usr /password:pwd /sprocs /namespace:AccountContext /context:AccountContext /dbml:AccountContext.dbml /language:csharp /serialization:unidirectional
sqlmetal.exe /sprocs /namespace:AccountContext /context:AccountContext /code:AccountContext.cs /language:csharp /serialization:unidirectional AccountContext.dbml

这不会生成关联。事实上,从 SQLMetal 与设计器视图中检查 DBML 文件:

设计视图 DBML:

<Type Name="A01_AccountMaster">
<!-- ... -->
<Column Name="AccountNumber" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<Association Name="A01_AccountMaster_A01aAccountNote" Member="A01aAccountNotes" ThisKey="AccountNumber" OtherKey="AccountNumber" Type="A01aAccountNote" />
<!-- ... -->
</Type>

SQLMetal DBML:

<Type Name="A01_AccountMaster">
<!-- ... -->
<Column Name="AccountNumber" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<!-- ... -->
</Type>

因此在 DBML 步骤中已经缺少关联。

由于数据库包含大量的表/存储过程,使用设计器重新生成 DataContext 类是不切实际的。如何让 SQLMetal 正确生成关联?

编辑:

在整个数据库上运行 SQLMetal,我意识到某些实体关联正在正确生成。 AccountNotes 上的外键定义为:

ALTER TABLE [dbo].[A01aAccountNotes]  WITH CHECK ADD  CONSTRAINT [FK_A01aAccountNotes_A01_AccountMaster] FOREIGN KEY([AccountNumber])
REFERENCES [dbo].[A01_AccountMaster] ([AccountNumber])
GO

ALTER TABLE [dbo].[A01aAccountNotes] CHECK CONSTRAINT [FK_A01aAccountNotes_A01_AccountMaster]
GO

编辑2:

我注意到正确创建的关联是那些具有 ON DELETE CASCADE/UPDATE 规则的关联。那么生成没有在数据库级别严格定义此规则的关联是否荒谬?

【问题讨论】:

    标签: linq-to-sql sqlmetal


    【解决方案1】:

    我们遇到了类似的问题,其中表有一个冗余索引,该索引被定义为列上的唯一非聚集索引,该列是已经是聚集索引的表主键。当我们试图删除非聚集索引时,SQL Server 拒绝了,因为有外键依赖它。我们不得不删除所有的外键,删除索引,重新创建外键(现在取决于实际的 PK)然后 SQL Metal 很高兴。

    【讨论】:

    • My SQL Metal 现在也很开心 :)
    • 我有类似的问题。 FK 绑定到纯唯一索引,并且未生成关联。我不得不删除唯一索引并添加唯一约束。现在它起作用了。谢谢你指点方向。
    【解决方案2】:

    听起来要么是 SQLMetal 中存在错误,要么是数据库中存在一些不一致。

    你会得到不同的提取结果,因为它是两个不同的代码库(不要问)。

    您可以做的一件事是打开 SQL 跟踪以观察 SqlMetal 发送到数据库以检索列表的 TSQL DDL 命令。它们是 INFORMATION_SCHEMA 查询与各种连接的组合。

    听起来,查看关联所需的连接的一部分失败了。如果您将它发送到 SQL Server 的查询复制到 SQL Management Studio 窗口中并运行它们,您可能还会看到缺少关联。

    一旦您确认是这种情况,您可以尝试将一些联接转换为 LEFT 联接,以查看哪个部分失败(或删除一些 WHERE 条件)。在某些时候,查询将返回关联。

    然后您可以调整架构以使其正常工作(SQLMetal 的源不可用:()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      相关资源
      最近更新 更多