我正在为数据库生成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 /更新的规则。那么在数据库级别生成没有严格定义此规则的关联是否是无意义的?
我的SQL金属现在也开心:) – dioslaska 2011-11-01 09:01:28
我有类似的问题。 FK被绑定到纯粹的唯一索引,并且没有生成关联。我不得不放弃唯一索引并添加唯一约束。现在它可以工作。谢谢你指出方向。 – 2017-02-06 03:38:44