2016-04-11 53 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的设计是直接与具体类型(即类)一起作为模型。

相关问题