Linq to sql 未生成SQLMetal DataContext关联

Linq to sql 未生成SQLMetal DataContext关联,linq-to-sql,sqlmetal,Linq To Sql,Sqlmetal,我正在为数据库生成LINQ到SQL DataContext和实体类。数据库有几个表,其中两个是-[AccountMaster]和[AccountCodes]。它们之间定义了外键关系,[AccountMaster].AccountNumber引用自[AccountCodes] 在VS2008中添加LINQ to SQL文件并将这些表拖动到DBML设计视图中,会在AccountMaster类中生成AccountNotes的集合。同时,使用SQLMetal生成DataContext不会生成任何Enti

我正在为数据库生成LINQ到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生成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和designer视图检查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>
编辑2:


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

听起来可能是SQLMetal中存在错误,或者数据库中存在一些不一致性

您将得到不同的结果提取,因为它是两个不同的代码基(不要问)

您可以做的一件事是打开SQL跟踪以观察SqlMetal发送到数据库以检索列表的TSQL DDL命令。它们是具有各种联接的信息和模式查询的组合

这听起来像是看到这些协会所需要的连接的一部分是缺火的。如果将它发送到SQLServer的查询复制到SQLServerManagementStudio窗口并运行它们,您可能还会看到缺少关联

一旦您确认了这种情况,您可以尝试将一些连接转换为左连接,以查看哪个部分失败(或删除一些WHERE条件)。在某个时刻,查询将返回关联


然后,您可以调整模式使其工作(SQLMetal的源代码不可用:()

我们遇到了一个类似的问题,一个表的冗余索引被定义为列上唯一的非聚集索引,该列是表主键,它已经是聚集索引。当我们试图删除非聚集索引时,SQL Server拒绝了,因为有依赖于它的外键。我们必须删除所有外键ys,删除索引,重新创建外键(现在取决于实际主键),然后SQL Metal很高兴。

我的SQL Metal现在也很高兴:)我也有类似的问题。FK已绑定到普通唯一索引,未生成关联。我不得不删除唯一索引,改为添加唯一约束。现在它起作用了。谢谢你指点方向。
<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>
<Type Name="A01_AccountMaster">
<!-- ... -->
<Column Name="AccountNumber" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<!-- ... -->
</Type>
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