簡體   English   中英

ORM 是否可以使用實體框架?

[英]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有兩種方法:

  • 在 SSDL 中使用DefiningQuery DefiningQuery是自定義 SQL 用於加載您想要 map 的列。 EF 不會打擾您加入多少表來獲取結果集。 問題是,每次您嘗試從數據庫中更新 model時,默認設計器都會刪除您的DefiningQuery
  • 在 MSL 中使用QueryView QueryView是映射到新實體的自定義實體 SQL 視圖。 它建立在 model 中定義的實體之上。 因此,您還必須 map EntityEntityTypeEntitySource (但您可以將它們設置為例如內部數據程序集)。 QueryView在來自數據庫的更新中幸存下來。

DefiningQueryQueryView都必須直接在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM