繁体   English   中英

数据类型在实体框架中不匹配时的导航属性

[英]Navigation properties when datatypes does not match in 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服务中公开它。

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

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

  • Event上创建一个1:1视图,其中包含一个将小数转换为整数的附加列。 该属性应标记为计算。
  • 在与Object的FK关联中使用该属性,因此Object具有映射到视图的导航属性EventViewItems (如果您愿意)。 (您必须在edmx设计器中手动添加关联并调整外键字段 )。
  • 在一个linq语句中读取对象和事件,如db.Objects.Include(o => o.EventViewItems)

但你不能

  • 将事件添加到db.Objects.EventViewItems ,因为您无法写入FK字段。
  • 将事件添加到db.EventViewItems因为没有为视图定义InsertFunction。 (除非你将视图作为表破解到模型中 )。

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

感觉不稳定,因为你必须注意不要遇到运行时异常的步骤。 另一方面,您将拥有单独的读取和CUD路径。 称之为CQRS,这个设计突然变得前沿。

你可以试试这个。 将模型中Num11的类型更改为整数。 在Event的配置中,使用xx.HasColumnType(“int”)将num11的databasetyp设置为int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM