2010-06-09 43 views
3

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

在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文件中的指导,然后从中生成DataContext.cs文件导致DBML:

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一步已经失踪。

由于数据库包含大量表/ sprocs,因此使用设计器重新生成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 

EDIT2:

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

回答

1

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

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

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

这听起来像的联接需要看到的是联想哑火的一部分。如果您将发送到SQL Server的查询复制到SQL Management Studio窗口并运行它们,您可能也会看到缺失的关联。

一旦你确认这是你可以尝试关闭一些连接到左连接,看看哪部分出现故障的情况下(或删除某些WHERE条件)。在某个时候,查询将返回关联。

然后,您可能能够调整架构,以便它的工作原理(用于SQLMetal源是不可用:()

3

我们也有类似的问题,即一个表有这样的定义为一个独特的冗余指数非群集上那就是已经是聚集索引的表的主键列索引。当我们试图删除非聚集索引时,SQL Server的抵制,因为有这取决于它的外键。我们必须删除所有外键,删除索引,重新创建外键(现根据实际PK),然后SQL金属是幸福的。

+0

我的SQL金属现在也开心:) – dioslaska 2011-11-01 09:01:28

+0

我有类似的问题。 FK被绑定到纯粹的唯一索引,并且没有生成关联。我不得不放弃唯一索引并添加唯一约束。现在它可以工作。谢谢你指出方向。 – 2017-02-06 03:38:44