Linq到asp.net中的实体和泛型删除方法

时间:2011-09-27 17:18:00

标签: linq generics

我在创建通用删除方法时遇到问题,甚至不确定是否可能。我有一个删除方法,它将根据实体类型和行ID值(pk)从db中删除记录, 这工作正常,但它需要提前知道类型。在某些情况下,我只能得到对象 在运行时使用Object.GetType()类型(例如从viewstate开始),这就是麻烦开始的时候。这是我的方法,当类型已知时有效,有没有办法修改它,以便它将使用Object.GetType()而不是T?

         public void Delete<T>(long Id) where T : class,new()
    {

        #region PerformaneMonitor

        IDbEntities Db=null;
        T item=null;

        try
        {
             Db = this.GetDatabase();

            item = new T();
            Type itemType = item.GetType();

            EntityContainer entityContainer = Db.MetadataWorkspace.GetEntityContainer(Db.DefaultContainerName, DataSpace.CSpace);

            var entity = entityContainer.BaseEntitySets.First(b => b.ElementType.Name == itemType.Name);

            if (entity.ElementType.KeyMembers.Count == 0)
            {
                throw new Exception("Unable to delete a record witout unique id");
            }

            string PrimaryKeyName = entity.ElementType.KeyMembers[0].Name;


            itemType.GetProperty(PrimaryKeyName).SetValue(item, Id, null);
        }
        catch (Exception ex)
        {
            Close(Db);
            throw(ex);

        }

        this.Delete<T>(item, Db);
        Close(Db);



        #region PerformaneMonitor


    }

所以我试图将其转换为Delete(对象EntityType,long Id),但没有运气。

这就是它的样子:

  public void Delete(object target,long Id) 
    {

        #region PerformaneMonitor

        IDbEntities Db = null;

        try
        {
            Db = this.GetDatabase();

            Type itemType = (Type)target;

            EntityContainer entityContainer = Db.MetadataWorkspace.GetEntityContainer(Db.DefaultContainerName, DataSpace.CSpace);

            var entity= entityContainer.BaseEntitySets.First(b => b.ElementType.Name == itemType.Name);

            if (entity.ElementType.KeyMembers.Count == 0) 
            {
                throw new Exception("Unable to delete a record witout unique id");
            }

            string PrimaryKeyName = entity.ElementType.KeyMembers[0].Name;



            itemType.GetProperty(PrimaryKeyName).SetValue(target, Id, null);
        }
        catch (Exception ex)
        {
            Close(Db);
            throw (ex);

        }


        this.Delete(target, Db);

        Close(Db);

        //_method_tag_end_

        #region PerformaneMonitor


    }

我得到'对象与目标类型不匹配' 这一行:     itemType.GetProperty(PrimaryKeyName).SetValue(target,pkey,null); 对象目标是特定类型的actaul实例,我在调用方法中从对象类型和使用反射并传递给此函数,但我仍然不知道它在运行时是什么类型。

如果有人可以提供帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

听起来你应该按照以下方式做点什么:(抱歉,无法测试以确保它按照书面形式运行。)

object o = itemType.GetProperty(PrimaryKeyName);
MethodInfo mi = o.GetType().GetMethod("SetValue");
mi.Invoke(o, new object [] { Id, null });
相关问题