DbSet.Cast()Error:CannotcreateDbSetforobjectoftype"Entity"fromnon-genericsDbSet版本信息:我使用的是C#4.5、EntityFramework6.0和MEF。代码和单元测试我创建了一个测试项目来解释这个问题:https://skydrive.live.com/redir?id=1resid=E3C97EC293A34048!2234请打开UnitTest项目并尝试运行TestIfItWorks()单元测试。问题我想将非通用DbSet转换为其通用版本,但出现以下异常:InvalidCastException:无法从非通用DbSet为“用户”类型的对象创建DbSet:varnonGeneric=context.Set(typeof(用户));vargeneric=nonGeneric.Cast();//这里的异常User类正在实现IUser,因此您认为转换应该不是问题,除非DbSet代码仅限于具体类(我希望不需要围绕非genericDbSet将其转换为genericDbSet或找到当前DbSet实现的替代方案)。如果你想知道为什么我要使用接口,即使它们目前不受Microsoft支持,我也会给你一些解释(希望这会过滤掉“不要那样做”的响应而不是提供解决方案):我正在使用MEF和EntityFramework创建一个松耦合数据层引擎,通过它我可以为每个项目提供实体(及其相应的配置)。我一直在广泛使用接口来定义引擎。使用MEF在运行时发现上下文中实体的元数据和具体实现。摘自代码[TestMethod]publicvoidTestIfItWorks(){//TODO:请打开App.Config并更改PluginsPath以匹配您机器中的Plugins文件夹。using(vardbContext=newMyContext())//请暂时忽略这一行。这是UnitOfWork,我将其替换为Context以创建一个简单的单元测试{dbContext.Setup();//请暂时忽略这一行。这是UnitOfWork的一部分,我搬到这里是为了创建一个简单的单元测试//所有这些的目的是能够在外部程序集中定义用户类时从/向数据库读取和写入用户信息//但是我们可以使用IUser接口通过MEF导入它。//失败的尝试#1:直接使用用户类!这不起作用,因为User在我们没有引用的外部类中//varfailedAttempt1=dbContext.Set();//失败的尝试#2:但好消息是我们可以访问IUser及其导出//然后让我们获取一个DbSet而不是varfailedAttempt2=dbContext.Set();尝试{varthrowsException2=failedAttempt2.FirstOrDefault();}catch(InvalidOperationExceptionex){//InvalidOperationException://实体类型IUser不是当前上下文模型的一部分。//当我试图定义一个继承自EntityTypeConfigurationatTestImplementation的类时,它也没有工作}//好吧,这次让我们做不同的事情。让我们从我们的容器中获取用户类型(我们知道我们有很好的配置)//并要求上下文给我们非通用版本varuserImplementationType=Logic.Instance.GetExportedTypes().FirstOrDefault();Assert.IsNotNull(userImplementationType,"我们无法将TestImplementation加载到目录中。请确保在App.Config中正确设置了PluginsPath");varnonGeneric=dbContext.Set(userImplementationType);////到目前为止这是有效的,我们可以使用//非通用版本的DbSet从数据库中添加和删除记录。您可以取消注释以下内容降低代码块提供唯一ID//并自行测试。//varnewUser=Logic.Instance.New();newUser.Id="99";newUser.UserName="AidinSadighi";nonGeneric.Add(新用户);尝试{dbContext.SaveChanges();}catch(DbUpdateExceptionex){//这没关系,因为很可能这是重复用户。只需增加Id即可使其独一无二。}//失败的尝试#3:将非通用DbSet转换为通用try{//TODO:我需要解决这个问题。请帮助我vargenericSet=nonGeneric.Cast();}catch(InvalidCastExceptionex){//无法从非泛型DbSet为类型为“User”的对象创建DbSet。为此,我实际上建议使用反射在DbContext的构造函数中,您可以将属性设置为函数指针:method=this.GetType().GetMethod("Set",newType[0]).MakeGenericMethod(typeof(用户实现));然后你可以调用它:method.Invoke(this,newobject[0]);这应该返回一个DbSet类型的对象,然后您可以调用.Cast()方法。替换nonGeneric.Cast();通过Enumerable.Cast(nonGeneric);好吧,我对实体框架一无所知,但是通过查看文档http://msdn.microsoft.com/en-us/library/gg696521%28v=vs.103%29.aspxDbSetitem=DbContext。放;其实你的代码是一样的:DbSetnonGeneric=context.Set();并获得一个IUserDbSetnonGeneric=context.Set();或者以上就是C#学习教程:DbSet.Cast()error:UnabletocreateDbSetfromanon-genericsDbSetforanobjectoftype"entity"DbSet分享的所有内容,如果对大家有用还需要了解更多关于C#学习教程,希望大家多多关注——vargeneric=nonGeneric.Cast>();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
