簡體   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