实体框架:基于列值输入?

时间:2009-01-21 16:55:29

标签: entity-framework

如果标志为IsAdmin,则强制转换为AdminUser,否则将其强制转换为NormalUser。

对此非常好奇,但不知道该怎么做。我确实看到你可以根据表值和另一个表创建一个子对象,如:

SiteUser来自Site_User表 当Site_User.IsAdmin = true时,AdminUser来自表Site_User和Admin_User

但是,如果你能做到这一点,我很好奇:

如果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;
    }
}

当然,无论如何这可能是一个坏主意,但是想知道是否可能。

3 个答案:

答案 0 :(得分:2)

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

Table-Per-Type表示每个类使用一个新表,包括抽象类型。 Table-Per-Hierarchy表示单个表用于存储多种类型的数据,并且只从该表中提取该类型所需的列。

无论哪种方式,都可以按照您描述的方式测试对象。<​​/ p>

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

可以在此处找到有关使用这两者的更多信息,并且它们都在Entity Framework设计器中以可视方式支持:

Table-Per-Type

Table-Per-Hierarchy

答案 1 :(得分:0)

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

无论如何,我不确定你的问题是什么?

答案 2 :(得分:0)

在查看上面两篇文章后我也发现了这一点:

http://weblogs.asp.net/zeeshanhirani/archive/2008/08/16/single-table-inheritance-in-entity-framework.aspx

这给出了我尝试做的UI示例。真好。