Linq到asp.net中的实体和通用删除方法
我在创建泛型删除方法时遇到问题,甚至不确定这是否可能。我有一个删除方法,它将根据实体类型和行id值(pk)从数据库中删除记录, 这样可以,但需要提前知道类型。在某些情况下,我只能获取对象 在运行时使用Object.GetType()键入(就像从viewstate中),这时问题就开始了。这是我的方法,当类型已知时可以工作,有没有办法修改它,使它使用Object.GetType()而不是TLinq到asp.net中的实体和通用删除方法,linq,generics,Linq,Generics,我在创建泛型删除方法时遇到问题,甚至不确定这是否可能。我有一个删除方法,它将根据实体类型和行id值(pk)从数据库中删除记录, 这样可以,但需要提前知道类型。在某些情况下,我只能获取对象 在运行时使用Object.GetType()键入(就像从viewstate中),这时问题就开始了。这是我的方法,当类型已知时可以工作,有没有办法修改它,使它使用Object.GetType()而不是T public void Delete<T>(long Id) where 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
}
我在上得到“对象与目标类型不匹配”
这一行:
itemType.GetProperty(PrimaryKeyName).SetValue(target,pkey,null);
对象目标是特定类型的actaul实例,我在从对象类型调用方法中使用反射和传递到该函数,但我仍然不知道它在运行时是什么类型
如果有人能帮上忙,我们将不胜感激。听起来你应该按照以下思路做一些事情:(对不起,无法测试以确保它按书面形式工作。)
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
}
object o = itemType.GetProperty(PrimaryKeyName);
MethodInfo mi = o.GetType().GetMethod("SetValue");
mi.Invoke(o, new object [] { Id, null });