2010-06-09 76 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