c#实体框架-泛型解决方案
以下代码是否有泛型解决方案c#实体框架-泛型解决方案,c#,entity-framework,generics,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
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;
}
publicstaticintsavereorder(IListListItems)
{
int结果=0;
整数阶=1;
entity1db=null;
使用(ObjectContext=new ObjectContext())
{
foreach(列表项中的int-id)
{
db=Get(上下文,id);
db.Order=订单;
SaveChanges();
订单+=1;
}
结果=1;
}
返回结果;
}
listItems包含标识符的有序序列。
Entity1是我们EDM中的EntityObjects之一。
Get(…)是同一类中的自定义方法,用于根据当前ObjectContext和Id获取EntityObject
我们希望为这个实现提供一个通用的解决方案,这样我们就可以将它应用于几个EntityObjects,其中属性“Order”是所有EntityObjects的公共属性。这可能吗?不,但是在未来的C#4.0中,使用动态关键字可以做到这一点
使用订单属性实现接口
目前,每个类都可以实现一个带有order属性的接口,我不知道如何在EDM中实现,但这并不困难
我们经常遇到这种问题,这就是为什么C#采用动态类型,我们依赖于接口或反射。正如Akash所建议的,我们想到了两个选项:
- 让实体实现具有“Order”属性的接口: 接口IEntityOrder{int Order{get;set;} 分部类Entity1:EntityObject{} 分部类Entity1:IEntityOrder{public int Order{get;set;}
- 或者使用反射设置“Order”属性的值(如果是字段,则为FieldInfo): PropertyInfo pi=db.GetType().GetProperty(“顺序”) pi.SetValue(db,newValue,null)
- 好的。谢谢你的回答。
这是我的解决办法
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;
}
public static int SaveReorder(IList listItems),其中T:EntityObject
{
int结果=0;
int-volgorde=1;
T entityObject=null;
使用(vgplannewEntities objectContext=new vgplannewEntities())
{
尝试
{
foreach(列表项中的int-id)
{
entityObject=objectContext.GetEntityByKey(id,新字符串[]{});
PropertyInfo pi=entityObject.GetType().GetProperty(“Volgorde”);
设置值(entityObject,volgorde,null);
objectContext.SaveChanges();
volgorde+=1;
}
结果=1;
}
抓住
{
结果=0;
}
}
返回结果;
}