English 中文(简体)
实体框架: 基于列值的类型?
原标题:
  • 时间:2009-01-21 16:55:29
  •  标签:

如果有一个标志 IsAdmin,将其转换为 AdminUser,否则将其转换为 NormalUser。

只是好奇,不确定如何做到这一点。我看到你可以根据表格值和另一个表格创建子对象,例如:

SiteUser is from the table Site_User AdminUser is from the table Site_User and Admin_User when Site_User.IsAdmin = true

然而,我很好奇你能否做到这一点:

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

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

最佳回答

实体框架支持基于类型和基于层次结构的表继承。

"Table-Per-Type" 意味着每个类别包括抽象类别都使用一个新的表格。"Table-Per-Hierarchy" 意味着一个单一的表格用于存储多个类型的数据,而只有该类型所需的列被从单一表格中拉取。

无论如何,一个物体都可以按照您所描述的方式进行测试。

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

有关使用这两个工具的更多信息,请在此处查找,并且它们在实体框架设计器中都有可视化支持:

按类型分表

继承关系表(Table-Per-Hierarchy)

问题回答

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

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

在查看以上两篇文章后,我还发现了这个。

将此翻译成中文:http://weblogs.asp.net/zeeshanhirani/archive/2008/08/16/single-table-inheritance-in-entity-framework.aspx 在实体框架中使用单表继承。

这是我尝试做的一个UI示例。有点不错。





相关问题
热门标签