Mar*_*rot 6 c# entity-framework sql-server-2005 .net-4.5
我正在尝试将遗留数据库映射到实体框架模型。该数据库非常通用,大多数数据存储在表“对象”和“事件”中。这些列的名称类似“ 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)
);
Run Code Online (Sandbox Code Playgroud)
对于的某些值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'
Run Code Online (Sandbox Code Playgroud)
在实体框架设计器中,我可以为每种类型的对象创建一个单独的实体,并适当地重命名这些列。当我尝试在实体之间创建导航属性时,问题就开始了,因为外键列类型并不总是与主键匹配。
SQL Server和Entity Framework都不允许我在各列之间创建外键引用。
当FK an和PK数据类型不完全匹配时,如何在实体之间创建导航属性?使我能够将相关实体包含在LINQ查询中,并希望能够在OData服务中公开它。
我无法对数据库中的现有表进行任何更改,但是如果需要,我可以添加视图。虽然我将需要能够将实体保存回数据库。
这不是一个令人愉快的设计,但是还有一些选择。您可以执行以下操作:
Event带有附加列的1:1视图,该列将小数转换为整数。该属性应标记为已计算。Object,因此Object还有一个导航属性EventViewItems(如果您愿意)可以映射到视图。(您必须在edmx设计器中手动添加关联,并调整外键字段)。db.Objects.Include(o => o.EventViewItems)但是你不能
db.Objects.EventViewItems,因为您无法写入FK字段。db.EventViewItems因为没有为视图定义InsertFunction。(除非您将视图作为表侵入模型中)。因此,您还必须Event在模型中包含原始对象,并使用其创建/更新/删除(CUD)单个Event对象。
感觉很不稳定,因为您必须注意自己的步骤,以免遇到运行时异常。另一方面,您将具有用于读取和CUD的单独路径。称其为CQRS,这种设计突然变得非常先进。
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |