【问题标题】:Linq and DB relationshipsLinq 和 DB 关系
【发布时间】:2026-01-01 05:25:01
【问题描述】:

在这里快速提问。

我正在使用一个较旧的数据库,它没有任何关系,现在正试图使其尽可能一致。

我移植的代码有一些怪癖,导致我无法强制执行这种关系(PK FK)。我想知道这种强制关系是否是 Linq to SQL 的要求?

感谢帮助:)


正如我评论其中一个可能的答案...

这个问题要简单得多:

linq 是否允许获取不强制一致性的关系上的数据? 我不是在谈论添加更多道具...

这意味着我认为确实具有正确 PKFK 关系的值的功能(正如我所说,我还没有测试过,也许你们中的一些人有?)。这对不存在的值有什么作用?提出一个空引用?

【问题讨论】:

    标签: .net sql-server linq-to-sql


    【解决方案1】:

    自动生成的 LINQ to SQL 类(位于 dbml 下的 .cs 文件中)为 partial,因此您可以根据需要添加其他属性和功能。

    LINQ 使用 SQL 中的显式关系来添加属性 - 例如,如果您有一个 Customers 表和一个具有显式关系的 Orders 表,则 LINQ 将能够将强类型的 Orders 集合作为属性放在客户对象。没有它,它只能将 CustomerID(int 或其他)放在 Order 对象上。

    在没有显式关系的情况下,您可以手动将属性和属性装饰添加到自动生成的实体类中。我强烈建议在部分类中尽可能多地放置,这样在重新生成实体类时更改不会丢失。

    【讨论】:

    • 我遇到的问题与正在使用的值有关,这些值在主键表中找不到。例如,如果链接被删除而不是 null,则将 ID 设置为 0。这个 0 值在整个必须保留的代码中使用,因此不允许我调整它。我看到它的方式是我可以建立关系而不让它强制一致性(我还没有尝试过),看看 linq 是否允许我获取现有的 PK 记录。这有意义吗?
    【解决方案2】:

    数据库中的关系不是必需的。设计器使用它来推断您自动获得的关系“属性”,但您可以添加自己的并指示哪些标量属性标识两个表中的关系。 (右击设计器,选择“添加关系”并识别表和列,或使用“关系”工具拖放)

    不过要小心。如果您的问题是应用程序存储“占位符值”以识别“无关系”(例如在主键表中没有对应项的零值),那么如果您尝试访问相应的成员,最终可能会引发异常代码。

    如果问题在于原始应用程序以错误的顺序存储内容(因此阻止您强制执行 FK 约束),但说到底,您有一致的数据,那么您应该没有问题。

    【讨论】: