gpt4 book ai didi

c# - Entity Framework 中数据类型不匹配时的导航属性

转载 作者:太空狗 更新时间:2023-10-29 23:08:44 26 4
gpt4 key购买 nike

我正在尝试将遗留数据库映射到 Entity Framework 模型中。数据库非常通用,大部分数据都存储在“Object”和“Event”表中。这些列的名称类似于“Date1”、“Num11”、“Text4”。数据库中没有定义明确的外键。

这是两个表的子集:

CREATE TABLE [Object] (
[ObjectId] int not null identity(1,1) primary key,
[ObjectTypeId] int,
[Name] varchar(100)
);

CREATE TABLE [Event] (
[EventId] int not null identity(1,1) primary key,
[EventTypeId] int,
[Subject] text,
[Body] text,
[Date1] datetime,
[Num11] decimal(18,2)
);

对于 EventTypeID 的某些值,Num11 字段引用一个 Object。我可以轻松地在表之间编写连接:

SELECT
ev.[EventId], ev.[Subject], ev.[Body], ev.[Date1] AS [CreatedDate],
p.[ObjectId] AS [PersonId], p.[Name] AS [PersonName]
FROM [Event] ev
LEFT JOIN [Object] p ON p.ObjectId = ev.Num11
WHERE ev.[EventTypeId] = 7
AND ev.[Date1] > '2013-04-07'

在 Entity Framework 设计器中,我可以为每种类型的对象创建一个单独的实体,并适本地重命名列。当我尝试在实体之间创建导航属性时,问题就开始了,因为外键列类型并不总是与主键匹配。

SQL Server 和 Entity Framework 都不允许我在列之间创建外键引用。

当 FK an 和 PK 数据类型不完全匹配时,我如何在实体之间创建导航属性? 使我能够在 LINQ 查询中包含相关实体并希望能够在 OData 服务中公开它。

我无法对数据库中的现有表进行任何更改,但如果需要,我可以添加 View 。尽管我需要能够将实体保存回数据库。

最佳答案

不是一个令人愉快的设计,但还有一些选择。这是您可以做的:

  • Event 上创建一个 1:1 View ,其中包含一个将小数转换为整数的附加列。该属性应标记为已计算。
  • 在与 Object 的 FK 关联中使用该属性,因此 Object 具有导航属性 EventViewItems(如果您愿意)映射到看法。 (你必须 add the association manually in the edmx designer and tweak the foreign key field )。
  • 读取一个 linq 语句中的对象和事件,例如 db.Objects.Include(o => o.EventViewItems)

但是你不能

  • 将事件添加到 db.Objects.EventViewItems,因为您无法写入 FK 字段。
  • 将事件添加到 db.EventViewItems,因为没有为 View 定义 InsertFunction。 (除非你 hack the view into the model as a table )。

因此,您还必须在模型中包含原始 Event,并使用它来创建/更新/删除 (CUD) 单个 Event 对象。

感觉有点不稳定,因为您必须注意自己的步骤,以免遇到运行时异常。另一方面,您将拥有单独的读取和 CUD 路径。称它为 CQRS,这种设计一下子就走在了前沿。

关于c# - Entity Framework 中数据类型不匹配时的导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15876696/

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