当前位置: 首页 > 编程语言 > C#

EntityFramework通过ID获取对象?分享

时间:2023-04-10 17:38:10 C#

EntityFramework通过ID获取对象?泛型可以在不知道类型的情况下从我的EntityFramework获取对象吗?我正在考虑以下内容:publicTGetObjectByID(intid){return(fromiinmyDatabase.Twherei.ID==idselecti);那行得通吗?我可以使用Reflection以某种方式获取T.GetType().Name并将其用于表格吗?编辑另一个问题是并非所有可用表都使用“ID”作为其唯一列名。您可以定义一个所有实体都实现的接口:publicinterfaceIEntity{intId{get;}}和检索实体的方法:publicTGetObjectById(intid)whereT:class,IEntity{returncontext.CreateObjectSet().SingleOrDefault(e=>e.Id==id);您还可以使用与链接问题中提供的方法类似的方法。您只需使用另一种方法来获取您的实体:publicvirtualTGetByKey(intid)whereT:class,IEntity{stringcontainerName=context.DefaultContainerName;stringsetName=context.CreateObjectSet().EntitySet.Name;//构建实体键varentityKey=newEntityKey(containerName+"."+setName,"Id",id);返回(TEntity)Context.GetObjectByKey(entityKey);不同的是,即使你将实例加载到context中,第一个方法也总是查询数据库,而第二个方法首先检查实例是否被加载。此方法效率不高,因为它会重复构建这些名称。这是一种更通用的方法,可以使用任何键类型和名称,这里是一种适用于复杂键的方法。这些方法都不直接与继承一起工作——你必须提供基类型才能工作。我认为Find()方法可能能够做你想做的事(DbSet.Find方法)。varsomeEntity=dbSet.Find(keyValue);很难制定一个完全通用的解决方案,因为实体可以有复合键,但这适用于简单的单键情况。关键是将T限制为System.Data.Objects.DataClasses.EntityObject类型,然后具有EntityKey属性(表示主键)。staticTGetById(objectid)whereT:EntityObject{using(varcontext=newMyEntities()){returncontext.CreateObjectSet().SingleOrDefault(t=>t.EntityKey.EntityKeyValues[0].Value==id);}}终于解决了问题:http://pastebin.com/kjXUKBNS调用我使用的代码://获取我们正在保存的对象的IDPropertyInfoprop=GetProperty(entity,entity.EntityKey.EntityKeyValues[0].钥匙);stringentityID=prop.GetValue(entity,null).ToString();//获取此对象的当前版本varoriginalEntity=GetEntity(PropertyEquals,entityID);这假定您正在搜索的主键是主键列表中的一个。在权利框架上从id获取实体的另一种方法publicTGet(intid)whereT:EntityObject;{varObjectSet=_context.CreateObjectSet();varPropName=ObjectSet.EntitySet.ElementType.KeyMembers[0].ToString();返回ObjectSet.Where("it."+PropName+"="+id).FirstOrDefault();}结果SELECTTOP(1)[Extent1].[CatId]AS[CatId],[Extent1].[CatName]AS[CatName],[Extent1].[CatType]AS[CatType],FROM[dbo].[Categories]AS[Extent1]WHERE[Extent1].[CatId]=1我认为这可能会有所帮助=set.Context.CreateObjectSet();stringkeyName=entity.FirstOrDefault().EntityKey.EntityKeyValues.FirstOrDefault().Key;returnentity.Where("it."+keyName+"="+id).FirstOrDefault();我做的一件事是定义一个“KeyComparator”接口:publicinterfaceIHasKeyComparator{Expression>KeyComparator{get;然后,即使使用多值键,您也可以在某些对象上实现它:publicsealedclassMultiKeyedObject:IHasKeyComparator{publicintID1{get;放;}公共字符串ID2{得到;放;}只读表达式>mKeyComparator;publicExpression>KeyComparator{get{返回mKeyComparator;}}publicMultiKeyedObject(){mKeyComparator=other=>other.ID1==ID1&&other.ID2==ID2;如果你提供约束,你可以一般地使用它:publicTObjectRefresh(TObjectpObject)whereTObject:IHasKeyComparator{returnthis.Set().Single(pObject.KeyComparator);这样做需要你有一个对象的实例,尽管你可以用一个键值填充一个空实例,然后使用它从数据库中获取这就是我用来通过ID获取实体对象的方法。publicTEntityGetByKey(objectkeyValue)whereTEntity:class{EntityKeykey=GetEntityKey(keyValue);对象原始项目;if(ObjectContext.TryGetObjectByKey(key,outoriginalItem)){return(TEntity)originalItem;}返回默认值(TEntity);您可能会发现这是比上面介绍的解决方案更可靠的解决方案。我将它用作许多项目中公共存储库的一部分。希望对你有帮助。以上就是C#学习教程:EntityFramework通过ID获取对象?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: