[英]Is ORM possible with Entity Framework?
我們正在嘗試使用 EF 在域實體和表之間使用 ORM 實現數據層。 我們已經成功地使用與它們各自的表非常相似的域實體進行了簡單的映射,但是在嘗試使用更復雜的關系(在其表表示中包含外鍵)的 map 對象時遇到了挫折。 我發現很多關於使用 EF 和共享主鍵的表的“表拆分”的引用,但我們的模式並非如此。
例如,我希望將域實體作為 POCO,而對數據層的了解程度不亞於簡單的 ID:
public class EntityInfo
{
public int EntityId { get; set; }
public string EntityName { get; set; }
public string TypeName { get; set; }
public string ComponentName { get; set; }
}
public class Entity
{
public int EntityId { get; set; }
public EntityType Type { get; set; }
public EntitySource Source { get; set; }
public string Name { get; set; }
}
public class EntityType
{
public int TypeId { get; set; }
public string Name { get; set; }
}
public class EntitySource
{
public int SourceId { get; set; }
public string Name { get; set; }
}
這些將映射到一系列具有外鍵的等效表:
Table Entities:
[PK] int EntityId
[FK] int TypeId
[FK] int SourceId
string Name
Table EntityTypes:
[PK] int TypeId
string Name
Table EntitySources:
[PK] int SourceId
string Name
我們真正想做的是將表表示與域實體完全分開,並實現映射層 (.msl) 以解決這些有些復雜的關系。 盡管沒有自己的直接表表示,但上面的 EntityInfo class 將從表中構建並存儲到表中。 這樣的映射(多個表到對象層次結構)甚至可以使用 an.msl 嗎? EF可以嗎?
IIRC Entity Framework 1.0 不允許實體與表分離。 但我相信你可以用 EF 4.0 做到這一點
你至少試過了嗎? 您提供的 model 中沒有復雜的映射。 這是一對多關系的最基本映射。 只需在設計器中打開 EDMX 並從數據庫命令(從上下文菜單)運行更新。 Select 向導中的三個表並取消選中用於將外鍵添加到 model 的選項。
編輯:
是的實體框架能夠 map 甚至您的EntityInfo
object 但 object 將被只讀,因為它包含的所有相關實體(它們的 FK 關系)的信息都將丟失。 map有兩種方法:
DefiningQuery
是自定義 SQL 用於加載您想要 map 的列。 EF 不會打擾您加入多少表來獲取結果集。 問題是,每次您嘗試從數據庫中更新 model時,默認設計器都會刪除您的DefiningQuery
。QueryView
是映射到新實體的自定義實體 SQL 視圖。 它建立在 model 中定義的實體之上。 因此,您還必須 map Entity
、 EntityType
和EntitySource
(但您可以將它們設置為例如內部數據程序集)。 QueryView
在來自數據庫的更新中幸存下來。 DefiningQuery
和QueryView
都必須直接在 EDMX(以 XML 格式打開)中定義,因為設計器不支持它們。 這些功能在代碼優先方法中不可用。 這些功能創建只讀實體,因此如果您還需要 CUD 操作,則必須創建存儲過程並將 map 存儲到新創建的實體中。
還有最后一個最常用的選項 - 您可以創建 linq-to-entities 查詢,只需將映射的實體投影到未映射的EntityInfo
:
var infos = context.Entities
.Select(e => new EntityInfo
{
EntityId = e.EntityId,
EntityName = e.Name,
TypeName = e.Type.Name,
ComponentName = e.Source.Name
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.