我正在尝试将遗留数据库映射到实体框架模型。该数据库非常通用,大部分数据都存储在“对象”和“事件”表中。这些列被命名为“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'
在实体框架设计器中,我可以为每种类型的对象创建一个单独的实体,并适当地重命名列。当我尝试在实体之间创建导航属性时,问题就开始了,因为外键列类型并不总是与主键匹配。
SQL Server 和实体框架都不允许我在列之间创建外键引用。
当 FK an 和 PK 数据类型不完全匹配时,如何在实体之间创建导航属性?使我能够在 LINQ 查询中包含相关实体的东西,并希望能够在 OData 服务中公开它。
我无法对数据库中的现有表进行任何更改,但如果需要,我可以添加视图。虽然我需要能够将实体保存回数据库。