【问题标题】:Entity Framework support for old database that uses -1 to indicate no relationship?实体框架支持使用 -1 表示没有关系的旧数据库?
【发布时间】:2011-08-29 02:57:36
【问题描述】:

我有一个类似于以下示例的数据库:

客户

客户 ID 整数
名字...

文档

DocumentID int
客户 ID 整数
文档日期...

事情就是这样。并非所有文件都与客户相关。问题是这个旧数据库没有为 Document->CustomerID 使用 int NULL。相反,它是一个不可为空的 int,它使用存储值 -1 来表示它没有客户。在这个数据库之上运行的代码知道 -1 是特殊的,并且表示没有相关实体。

我的问题是现在我想在它之上构建一个实体模型。有没有办法告诉实体模型 Document 表的 CustomerID 字段中的 -1 表示没有关系? Entity Framework 必须将数据库层的 int 映射到模型层的可为空的 int,并且每当它从 db 检索记录时,它必须将 -1 的值映射为 null,并且无论何时保存,将 null 保存为 -1。并且在填充实体集时,也必须考虑这种映射。

这有意义吗?似乎实体框架可能在某个地方内置了一些东西,但话又说回来,也许不是。

想法?

【问题讨论】:

    标签: entity-framework mapping entity-relationship


    【解决方案1】:

    如果数据库没有建立在这些实体之上的关系(根据您的描述它不能有),EF 将不会为您创建这种关系。如果您使用的是 EFv4,您可以 define the relation yourselves 作为外键关联。

    EF 会像处理任何其他关系一样处理此问题。您必须通过将 FK 设置为 -1 或将导航属性设置为 new Customer { Id = -1 } 来欺骗 EF,并且您必须通过调用 context.ObjectStateManager.ChangeObjectState 来确保此虚拟实体的状态始终设置为 Unchanged。否则 EF 将在持久化Document 时尝试创建或修改此实体。

    单独的问题可以是延迟加载\急切加载。我真的不确定当 FK 包含不存在实体的Id 时,EF 将如何处理这种情况。我有点担心延迟加载和急切加载都会引发异常。

    处理这些问题的最简单方法是在您的数据库中使用Id -1 创建特殊的NullCustomer,以便您使用与真实数据库记录的关系。

    EF 不支持您的方案。

    【讨论】:

    • “EF 不支持您的方案”。这就是我害怕的。你和我想的一样。我不想将 id 为 -1 的虚拟记录放入其中,因为这会产生各种其他问题。在我将其标记为已回答之前,让我们看看是否有人对此有任何其他想法。我仍然抱有希望,不知何故,有一种超级隐藏的方法可以做到这一点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多