【问题标题】:Entity Framework generic method to retrieve primary key from combobox从组合框中检索主键的实体框架通用方法
【发布时间】:2015-09-15 07:10:18
【问题描述】:

我有一个非常简单的问题:我有一个基于组合框的自定义控件。它的每个实例都有一个数据库实体列表作为数据源(例如“订单”、“项目”、“客户”等)。我需要一种通用方法,它只返回所选项目的主键,而不管其类型如何。

我觉得这应该很容易,但我无法解决这个问题。我认为可以将如下函数添加到我的自定义组合框类中:

public int GetSelectedItemsPrimaryKey()
{
    return (SelectedItem as <<DBEntitiy>>).primaryKey;
}

但事实并非如此。我不知道是否存在所有数据库实体的基本类型,如果有,是否公开它的主键...

编辑

更多细节:我有一个自定义控件(称为 CheckedComboBox),它继承自组合框(因为它与组合框非常相似,只是将 CheckBox 用作项)。因此,此自定义控件将具有数据源字段。我想将此字段设置为数据库条目列表,例如来自数据库中的“订单”表。

using(var db = new DBEntities())
{
    CheckedComboBox.DataSource = db.Orders.ToList();
}

所以现在我有一堆这样的自定义控件,每个控件都有一个来自不同表的不同条目列表作为数据源。

现在我想给我的控制函数GetSelectedItemsPrimaryKey,它返回所选项目的主键。这不是问题,如果我知道 DataSource 中存储了哪些类型的项目,我可以这样做:

public int GetSelectedItemsPrimaryKey()
{
    return (SelectedItem as Order).OrderPrimaryKey;
}

但是我必须编写一个函数来检查所选项目是否属于数据库中的任何类型的条目,这很痛苦。所以我想要一个通用方法,它执行以下操作:

public int GetSelectedItemsPrimaryKey()
{
    return (SelectedItem as <<DBEntitiy>>).primaryKey;
}

【问题讨论】:

  • 不明白你到底想做什么!!你能更具体一点吗?这个方法将在 SelectedIndexChanged 或类似的东西上调用?您能否展示如何为您的组合框进行数据绑定?
  • @Mak 我试图详细说明问题...

标签: c# entity-framework combobox


【解决方案1】:

取决于您如何使用实体框架,这是否可行。即使有可能,这也是一个坏主意。

如果您使用代理对象,您可以访问包含类似信息的代理对象。但是,将 EF 的内部细节与您的 UI 逻辑混合在一起是对关注点分离的严重违反。

更好的方法是定义一个基类,您的实体都从该基类派生,包括这些类型的公共字段。然后,您始终可以安全地转换为基类型以获取 Id。

如果您不能使模型继承,另一种选择是定义一个具有通用属性命名的接口。如果您的 ID 属性不能被通用命名,您始终可以定义一个未映射的计算属性,以在每个适当命名的类上返回适当的值。

【讨论】:

  • 我真的很喜欢你的最后一个想法:我可以简单地定义一个接口 IEntity,它由我必须在所有表上实现的 primaryKey-get-property 组成,对吗?这仍然违反 SOC 吗?
  • 不,我认为不是。您基本上是让您的对象告诉您如何唯一地识别它们,虽然这在数据库中很重要,但对于数据库来说并不是真正独特的,并且同样适用于内存表示。
【解决方案2】:

查看您的架构似乎是不可能的。对于这种通用要求,您应该为所有实体提供一些基类或接口。因此,您可以通过将实体转换为基础来获得该属性值。

目前,如果您不能对架构进行大量更改,那么快速而肮脏的解决方案是使用 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;
    }
    //.....

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2014-02-28
    • 2012-03-26
    • 2011-08-26
    相关资源
    最近更新 更多