我有一个非常简单的问题:我有一个基于组合框的自定义控件。它的每个实例都有一个数据库实体列表作为数据源(例如" Orders"," Items"," Customers"等)。我需要一种通用的方法,只需返回所选Item的主键,无论其类型如何。
我觉得这应该很容易,但我无法解决这个问题。我认为可以在我的自定义组合框类中添加如下函数:
public int GetSelectedItemsPrimaryKey()
{
return (SelectedItem as <<DBEntitiy>>).primaryKey;
}
但事实并非如此。我不知道是否存在所有数据库实体的基本类型,如果是,它是否暴露了它的主键...
修改
更多细节:我有一个自定义控件(称为CheckedComboBox),它继承自comboBox(因为它与comboBox非常相似,只是将CheckBoxes作为Items)。因此,此自定义控件将具有数据源字段。这个字段我想设置成一个数据库条目列表,例如从表&#34; Orders&#34;在数据库中。
using(var db = new DBEntities())
{
CheckedComboBox.DataSource = db.Orders.ToList();
}
所以现在我有一堆这些自定义控件,每个控件都有一个不同表的不同条目列表作为DataSources。
现在我想给我的控件赋予函数GetSelectedItemsPrimaryKey
,它返回所选项的主键。这不是问题,如果我知道,DataSource中存储了哪些项目,我可以这样做:
public int GetSelectedItemsPrimaryKey()
{
return (SelectedItem as Order).OrderPrimaryKey;
}
但我必须编写一个函数来检查所选项是否属于数据库中的任何类型的条目,这很痛苦。所以我想要一个通用方法,它执行以下操作:
public int GetSelectedItemsPrimaryKey()
{
return (SelectedItem as <<DBEntitiy>>).primaryKey;
}
答案 0 :(得分:1)
取决于您是如何使用实体框架的,如果可能的话。即使有可能,这也是一个坏主意。
如果您正在使用代理对象,则可以访问包含某些信息的代理对象。但是,将EF的内部细节与您的UI逻辑混合在一起是对关注点分离的严重违反。
更好的方法是定义一个基类,您的实体都可以从中包含这些类型的公共字段。然后,您始终可以安全地转换为基本类型以获取Id。
如果无法使模型继承,则可以选择替代方法是定义具有公共属性命名的接口。如果您的ID属性无法通用命名,则始终可以定义未映射的计算属性,以便在每个适当命名的类上返回适当的值。
答案 1 :(得分:0)
看起来你的架构似乎不太可能。对于这种通用要求,您应该为所有实体提供一些基类或接口。因此,您可以通过将实体转换为基础来获取该属性值。
目前,如果您无法对架构进行大量更改,那么快速而肮脏的解决方案是使用is
运算符检查SelectedItem的类型,然后将其安全地转换为该类型并获取主要内容核心价值。
public int GetSelectedItemsPrimaryKey(object selectedItem)
{
if (selectedItem is Order)
{
return (selectedItem as Order).OrderPrimaryKey;
}
else if (selectedItem is Product)
{
return (SelectedItem as Product).ProductPrimaryKey;
}
//.....
}