【问题标题】:c# Entity Framework - Generics solutionc# Entity Framework - 泛型解决方案
【发布时间】:2009-08-29 07:33:17
【问题描述】:

以下代码有泛型解决方案吗?

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 包含一个有序的标识键序列。 Entity1 是我们 EDM 中的 EntityObject 之一。 Get(...) 是同一个类中的自定义方法,根据当前的 ObjectContext 和 Id 获取一个 EntityObject。

我们想要这个实现的通用解决方案,因此我们可以将它应用于多个实体对象,其中属性“顺序”是所有实体对象的公共属性。这可能吗?

【问题讨论】:

    标签: c# entity-framework generics


    【解决方案1】:

    我想到了两个选项,正如 Akash 已经建议的那样:

    • 要么让实体实现一个带有“订单”属性的接口:

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

      部分类 Entity1 : EntityObject { }

      部分类 Entity1 : IEntityOrder { public int Order { get;放; } }

    • 或者使用反射来设置'Order'属性的值(或者FieldInfo,如果它是一个字段):

      PropertyInfo pi = db.GetType().GetProperty("Order");

      pi.SetValue(db, newValue, null);

    【讨论】:

      【解决方案2】:

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

      使用订单属性实现接口

      目前你可以有一个每个类都实现了order属性的接口,我不知道如何在EDM中做到这一点,但应该不难。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-01-13
          • 1970-01-01
          • 2017-11-18
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2011-06-22
          相关资源
          最近更新 更多