[英]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設計器中手動添加關聯並調整外鍵字段 )。 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.