我正在为数据库生成LINQ-to-SQL DataContext和实体类。该数据库有几个表,其中两个是 - [AccountMaster]和[AccountCodes]。它们之间定义了一个外键关系,[AccountMaster] .AccountNumber从[AccountCodes]引用。
在VS2008中添加LINQ-to-SQL文件并将这些表拖到DBML设计视图中会在AccountMaster类中生成一组AccountNotes。同时,使用SQLMetal生成DataContext不会产生任何EntitySet集合。
Designer输出:
[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步骤中已经缺少关联。
由于数据库包含大量表/ 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 / UPDATE规则的关联。那么生成没有在数据库级别严格定义此规则的关联是否是荒谬的呢?
答案 0 :(得分:3)
我们遇到了类似的问题,其中一个表有一个冗余索引,该索引被定义为列的唯一非聚集索引,该列是已成为聚簇索引的表主键。当我们尝试删除非聚集索引时,SQL Server被拒绝,因为根据它有外键。我们不得不删除所有外键,删除索引,重新创建外键(现在取决于实际的PK),然后SQL Metal很高兴。
答案 1 :(得分:1)
听起来像SQLMetal中存在错误或数据库中存在一些不一致。
你会得到不同的结果,因为它是两个不同的代码库(不要问)。
您可以做的一件事是打开SQL跟踪以观察SqlMetal发送到数据库以检索列表的TSQL DDL命令。它们是INFORMATION_SCHEMA查询与各种连接的组合。
这听起来像是看到关联失败所需的加入的一部分。如果将它发送到SQL Server的查询复制到SQL Management Studio窗口并运行它们,您可能还会看到缺少关联。
一旦你确认了这种情况,你可以尝试将一些连接转换为LEFT连接,以查看哪个部分失败(或删除一些WHERE标准)。在某些时候,查询将返回关联。
然后,您可以调整架构以使其正常工作(SQLMetal的源代码不可用:()