gpt4 book ai didi

linq-to-sql - 未生成 SQLMetal DataContext 关联

转载 作者:行者123 更新时间:2023-12-01 13:06:11 33 4
gpt4 key购买 nike

我正在为数据库生成 LINQ-to-SQL DataContext 和实体类。数据库有几个表,其中两个是 - [AccountMaster] 和 [AccountCodes]。它们之间定义了一个外键关系,[AccountMaster].AccountNumber 从 [AccountCodes] 引用。

在 VS2008 中添加一个 LINQ-to-SQL 文件并将这些表拖到 DBML 设计 View 中,适本地在 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 与设计器 View 检查 DBML 文件:

设计 View 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 规则的关联。那么生成没有在数据库级别严格定义此规则的关联是没有意义的吗?

最佳答案

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

关于linq-to-sql - 未生成 SQLMetal DataContext 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007630/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com