c#实体框架 - 泛型解决方案

时间:2009-08-29 07:33:17

标签: c# entity-framework generics

以下代码是否有通用解决方案?

public static int SaveReorder(IList<int> listItems)
    {
        int result = 0;
        int order = 1;
        Entity1 db = null;

        using (ObjectContext context = new ObjectContext())
        {
            foreach (int id in listItems)
            {
                db = Get(context, id);
                db.Order = order;
                context.SaveChanges();
                order += 1;
            }
            result = 1;
        }
        return result;
    }

listItems包含一系列有序的identitykeys。 Entity1是我们EDM中的EntityObjects之一。 Get(...)是同一个类中的一个自定义方法,用于根据当前的ObjectContext和Id获取EntityObject。

我们需要一个针对此实现的通用解决方案,因此我们可以将其应用于多个EntityObjects,其中属性“Order”是所有EntityObjects的公共属性。这可能吗?

3 个答案:

答案 0 :(得分:1)

不,但是在将来使用动态关键字的C#4.0中,您可以这样做。

使用订单属性实现界面

目前,您可以拥有一个由每个类实现的订单属性的界面,我不知道如何在EDM中执行此操作,但它并不困难。

我们经常遇到这种问题,这就是为什么C#带有动态类型,我们依赖于接口或反射。

答案 1 :(得分:1)

有两种选择,正如阿卡什已经建议的那样:

  • 让实体实现具有'Order'属性的接口:

    interface IEntityOrder {int Order {get;组; }}

    partial class Entity1:EntityObject {}

    partial class Entity1:IEntityOrder {public int Order {get;组; }

  • 或者使用反射来设置'Order'属性的值(如果是Field的话,则使用FieldInfo):

    PropertyInfo pi = db.GetType()。GetProperty(“Order”);

    pi.SetValue(db,newValue,null);

答案 2 :(得分:0)

行。谢谢大家的回答。 这是我的解决方案。

public static int SaveReorder<T>(IList<int> listItems) where T : EntityObject
    {
        int result = 0;
        int volgorde = 1;
        T entityObject = null;

        using (vgplannewEntities objectContext = new vgplannewEntities())
        {
            try
            {
                foreach (int id in listItems)
                {
                    entityObject = objectContext.GetEntityByKey<T>(id, new String[] { });
                    PropertyInfo pi = entityObject.GetType().GetProperty("Volgorde");
                    pi.SetValue(entityObject, volgorde, null);
                    objectContext.SaveChanges();
                    volgorde += 1;
                }
                result = 1;
            }
            catch
            {
                result = 0;
            }
        }
        return result;
    }
相关问题