2009-01-21 43 views
2

如果一个标志IsAdmin,作为AdminUser转换,否则转换为NormalUser。实体框架:基于列值的类型?

只是好奇这个,但不知道如何去做。我确实看到,您可以根据表中的值和另一个表创建一个子对象,如:

SiteUser从表中可以Site_User 管理用户从表中可以Site_User和Admin_User当Site_User.IsAdmin =真

然而,我很好奇你是否可以这样做:

如果IsAdmin为true,则转换为AdminUser,否则转换为NormalUser,其中AdminUser:SiteUSer和NormalUser:SiteUser但不存在Admin_User表或Normal_User表。这完全是基于相同表格和列值的投射。该类型抱任何的附加信息,只是会像的情况下会有所帮助:

SomeMethod(SiteUser someUser) 
{ 
    if(someUser is AdminUser) 
    { 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 

相反的:

SomeMethod(SiteUser someUser) 
{ 
    if(someUser.IsAdmin) 
    { 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 

现在我意识到这可能不是最好的例子,但表示该标志为多价值属性,而不是:

SomeMethod(SiteUser someUser) 
{ 
    swith(someUser.Role) 
    { 
     case(1): 
      break; 
     case(2) 
      break; 
    } 
} 

当然,这可能是一个坏主意,但想知道是否有可能。

回答

2

实体框架支持Table-Per-Type和Table-Per-Hierarchy继承。

Table-Per-Type表示每个类使用一个新表,包括抽象类型。 “按层次分类”表示使用单个表来存储多种类型的数据,并且仅从该表中抽取该类型所需的列。

无论哪种方式,都可以按照您描述的方式测试对象。在使用这两种

if (someUser is AdminUser) 
{ 
    ... 
} 
else 
{ 
    ... 
} 

更多信息可以在这里找到,而且他们都是在实体框架设计可视化支持:

Table-Per-Type

Table-Per-Hierarchy

0

作为一个经验法则,检查某个对象是否是给定类的实例并不是一个好习惯。尝试使用方法或属性(someUser.isAdmin())。

反正我不确定你的问题是什么?

+0

是的,你可能是正确的第一部分,第二部分并不让我感到惊讶,因为我不是100%确定如何问。 – 2009-01-21 18:35:43