如果标志为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;
}
}
当然,无论如何这可能是一个坏主意,但是想知道是否可能。
答案 0 :(得分:2)
实体框架支持Table-Per-Type和Table-Per-Hierarchy继承。
Table-Per-Type表示每个类使用一个新表,包括抽象类型。 Table-Per-Hierarchy表示单个表用于存储多种类型的数据,并且只从该表中提取该类型所需的列。
无论哪种方式,都可以按照您描述的方式测试对象。</ p>
if (someUser is AdminUser)
{
...
}
else
{
...
}
可以在此处找到有关使用这两者的更多信息,并且它们都在Entity Framework设计器中以可视方式支持:
答案 1 :(得分:0)
根据经验,检查对象是否是给定类的实例并不是一种好习惯。请尝试使用方法或属性(someUser.isAdmin()
)。
无论如何,我不确定你的问题是什么?
答案 2 :(得分:0)
在查看上面两篇文章后我也发现了这一点:
这给出了我尝试做的UI示例。真好。