2016-04-11 58 views
2

我有一個像下面的代碼結構。我知道這個例子有點奇怪,但我正在使用的實體結構相似。如何將持久化實體轉換爲C#中的具體類型#

interface IAnimal 
{ 
    string name {get; set;} 
    int Age { get; set;} 
    string AnimalType { get; set;} 
    ICollection<Dependent> Dependents{get; set;} 
} 

interface IDependent : IAnimal 
{ 

    string RelationshipToParent{get; set;} 
} 

class Dependent : IDependent 
{ 
    public string name { get; set;} 
    public int Age { get; set;} 
    public string AnimalType { get; set;} 
    public string RelationshipToParent { get; set;} 
    public ICollection<Dependent> Dependents { get; set;} 
} 

class Animal : IAnimal 
{ 
    public string name { get; set;} 
    public int Age { get; set;} 
    public string AnimalType{get; set;} 
    public ICollection<Dependent> Dependents { get; set;} 
} 


class Tiger : IAnimal 
{ 
    public string name { get; set;} 
    public int Age { get; set;} 
    public string AnimalType{get; set;} 
    public ICollection<Dependent> Dependents { get; set;} 
} 

class Dog : IAnimal 
{ 
    public string name { get; set;} 
    public int Age{ get; set;} 
    public string AnimalType{get; set;} 
    public ICollection<Dependent> Dependents{ get; set;} 
} 

class DogDependent : Dependent 
{ 

} 

class TigerDependent : Dependent 
{ 

} 

動物可以有家屬的任何其他動物(eg..Tiger可以有家屬如狗和大象) 動物和從屬類(使用實體框架)SQL Server中的持久化實體。 我的問題是我有大約20個這樣的具體動物..從DB讀取實體後,我需要一種複雜的方式來將動物轉換爲像虎,狗等具體類型。基於AnimalType屬性。

示例.. 如果AnimalType爲Animal的對象爲「Tiger」,則動物應轉換爲Tiger類型(具有所有屬性)。依賴者也是如此,如果從屬動物類型是狗,那麼依賴者應該轉化爲狗依賴。

有沒有更好的方法來做到這一點,而不是爲每種類型寫一個映射器?

+0

請提供某種形式的可編譯代碼。你有字段的接口,沒有類型的類成員字段等等。很難將僞問題從實際問題中分離出來。 – grek40

+0

@ grek40更新了代碼 – DivideByzero

+1

有幾件事我不明白你的代碼:接口應該描述行爲,也就是你的對象可以做的動作。根據這個動物應該是一個階級,也許是抽象的。你的具體動物不會在基礎動物身上添加任何功能,所以我認爲這不是必要的,你可以使用基礎動物並將混凝土動物作爲動物的屬性。所有這些都將上述模型簡化爲只有兩個類。 – lgrosales

回答

0

如果我正確理解你所問的是如何將你的對象模型映射到關係模型,對吧?如果是這種情況,那麼有很多模式可以做到這一點。 如果你已經定義了數據模型,並且你所有的具體動物(老虎,大象等)都在同一個表中,那麼最簡單的策略就是每個具體類一個表。您所要做的就是添加一個鑑別器列來區分每種類型,並告訴EF如何將每條記錄映射到基於此的特定類。

有很多文章描述了不同的策略,這是一個:

http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph

0

你映射的結構將根據每層級類型或表的表不同。

有沒有更好的方法來做到這一點,而不是爲每種類型寫一個映射器?

這取決於,如果你所有的類型都有額外的屬性,你將需要映射它們。如果您只想捕捉類中的行爲,但結構相同,則不必映射每種類型。

下面是一個示例,您可以在類型中使用單個表。目前,類型使用字符串進行硬編碼以區分類型。您還可以使用枚舉,並且還可以添加一些反射,以根據自定義屬性(例如)在運行時自動將已知類型及其標識符添加到映射中。

public sealed class DependentMap : EntityTypeConfiguration<Dependent> 
{ 
    internal DependentMap() 
    { 
     Map(configuration => configuration.MapInheritedProperties()); 
     this.ToTable("DependentAnimals").HasKey(t => t.DependentId); // making up some table name and pk here 

     // mapping types 
     // you could probably also map this using reflection if you structure your concrete types to include some type of indicator 
     Map<DogDependent>(configuration => configuration.Requires("AnimalType").HasValue("Dog"); 
     Map<TigerDependent>(configuration => configuration.Requires("AnimalType").HasValue("Tiger"); 
    } 
} 

一些的DbContext訪問

db.Set<TigerDependent>().Single(x => name == "Tony the Tiger"); 

免責聲明:作爲EF的目的不是直接與他們合作,我沒有你的界面做任何事情。 EF的設計是直接與具體類型(即類)一起作爲模型。

相關問題