我有一个将要执行基于实体框架的查询的类。这个类是一个通用类,是DbContext独立类(我的意思是没有ssdl或semiliar文件)。在这个类中,我也将执行原始的SQL查询。为此,我添加了一个方法:
Return _dbContext.Database.SqlQuery(Of String)(query).FirstOrDefault()
执行标量。但是在这个阶段有一个错误:
Additional information: Argument 'xmlReader' is not valid. A minimum of one .ssdl artifact must be supplied.
当我要创建DbContext的新实例时,我已将此连接字符串传递给它:
metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=MyDb;integrated security=true;
错误明细:
System.ArgumentException was unhandled by user code
HResult=-2147024809
Message=Argument 'xmlReader' is not valid. A minimum of one .ssdl artifact must be supplied.
Source=EntityFramework
StackTrace:
at System.Data.Entity.Core.EntityUtil.CheckArgumentEmpty[T](IEnumerable`1& enumerableArgument, Func`2 errorMessage, String argumentName)
at System.Data.Entity.Core.Metadata.Edm.StoreItemCollection..ctor(IEnumerable`1 xmlReaders, IEnumerable`1 filePaths)
at System.Data.Entity.Core.Metadata.Edm.MetadataCache.LoadStoreCollection(EdmItemCollection edmItemCollection, MetadataArtifactLoader loader)
at System.Data.Entity.Core.Metadata.Edm.MetadataCache.<>c__DisplayClass5.<>c__DisplayClass7.<GetMetadataWorkspace>b__1()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at System.Data.Entity.Core.Metadata.Edm.MetadataCache.<>c__DisplayClass5.<>c__DisplayClass7.<GetMetadataWorkspace>b__4()
at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.LoadAndCheckItemCollection[T](Func`1 itemCollectionLoader)
at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.<>c__DisplayClass16.<.ctor>b__f()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.GetItemCollection(DataSpace dataSpace, Boolean required)
at System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace.GetItemCollection(DataSpace dataSpace)
at System.Data.Entity.Core.Objects.ObjectContext.InitializeMappingViewCacheFactory(DbContext owner)
at System.Data.Entity.Core.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor, ObjectQueryExecutionPlanFactory objectQueryExecutionPlanFactory, Translator translator, ColumnMapFactory columnMapFactory)
at System.Data.Entity.Core.Objects.ObjectContext..ctor(EntityConnection connection)
at System.Data.Entity.Internal.InternalConnection.CreateObjectContextFromConnectionModel()
at System.Data.Entity.Internal.LazyInternalConnection.CreateObjectContextFromConnectionModel()
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Internal.LazyInternalContext.get_ObjectContext()
at System.Data.Entity.Internal.InternalContext.ExecuteSqlQuery[TElement](String sql, Nullable`1 streaming, Object[] parameters)
at System.Data.Entity.Internal.InternalContext.ExecuteSqlQueryAsIEnumerator[TElement](String sql, Nullable`1 streaming, Object[] parameters)
at System.Data.Entity.Internal.InternalContext.ExecuteSqlQuery(Type elementType, String sql, Nullable`1 streaming, Object[] parameters)
at System.Data.Entity.Internal.InternalSqlNonSetQuery.GetEnumerator()
at System.Data.Entity.Infrastructure.DbRawSqlQuery`1.GetEnumerator()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
at IdeaDataAccess.EF.EntityFrameworkQueryPerformer`1.ExecuteScalar(String query)
at IdeaBusiness.DatabaseCore.Core`2.ExecuteScalar(String query)
at IdeaBusiness.DatabaseCore.Facade.ExecuteScalar(String query)
at IdeaComponent.IdeaComponent.IdeaGridView.OnRowCreated(GridViewRowEventArgs e) in D:\Solutions\IdeaCenter\Source Code\IdeaCenterV2\IdeaComponent\Components\GridView\IdeaGridView.vb:line 515
at System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource)
at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding)
at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data)
at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data)
at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data)
at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
at System.Web.UI.WebControls.GridView.DataBind()
at WebApplication1.WebForm1.Page_Load(Object sender, EventArgs e) in C:\Users\idea\Desktop\New folder\WebForm1.aspx.vb:line 8
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
答案 0 :(得分:2)
我终于找到了解决这个问题的方法。我在我的UI中添加了对EntityFramework.dll的引用,然后将典型的连接字符串传递给我的Biz层并基于此创建了一个DbContext对象,从而在DataAccess中执行了没有错误的函数。感谢你所做的一切。 如果您需要了解有关我的解决方案的更多信息,请告诉我说明它
答案 1 :(得分:1)
查看你的连接字符串,它看起来有点缺乏。这是当前项目中的一个,添加了各种换行符以便于阅读:
<connectionStrings>
<add name="PowerDespatchConnection"
connectionString="
metadata=res://*/PowerDespatch.csdl|
res://*/PowerDespatch.ssdl|
res://*/PowerDespatch.msl;
provider=System.Data.SqlClient;
provider connection string="data source=athena;initial catalog=RCDev;Integrated Security=SSPI;App=EntityFramework"
"
providerName="System.Data.EntityClient" />
您缺少csdl,ssdl和msl部分。 (PowerDespatch是Model的名称。)你应该在你的EF项目文件夹下找到匹配的文件,在obj \ Debug \ edmxResourcesToEmbed中。
如果缺少这些,那么关于你如何创建模型的事情是不对的。