3

我正在为数据库生成 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 规则的关联。那么生成没有在数据库级别严格定义此规则的关联是否是荒谬的?

4

2 回答 2

3

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

于 2011-04-01T15:36:57.260 回答
1

听起来像是 SQLMetal 中存在错误或数据库中存在某些不一致。

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

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

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

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

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

于 2010-06-10T05:12:07.903 回答