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