我在实体框架查询中遇到一个非常奇怪的问题,我花了几个小时.
执行查询时,我得到一个异常:
在构造函数和初始值设定项中,LINQ to Entities中仅支持属性或字段参数绑定.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.NotSupportedException:在构造函数和初始值设定项中,LINQ to Entities中仅支持属性或字段参数绑定.
我知道当您调用带有查询内部参数的构造函数时,通常会发生此问题.这很自然,因为LINQ to Entities无法知道那里发生了什么.
但是,我的查询只使用对象初始化程序语法来填充值,我假设将调用默认的无参数构造函数:
private static readonly Func<MyEntities, int, MessageParty> _getUserMessagePartyQuery = CompiledQuery.Compile(
( MyEntities ctx, int id ) =>
ctx.Users
.Where( u => u.ID == id )
.Select( u => new {
u, up = u.UserProfile, img = u.UserProfile.Image
})
.Select( info => new MessageParty
{
PartyID = id,
Title = info.u.FullName,
// Assignment below causes the failure:
Image = {
Image = info.img, …Run Code Online (Sandbox Code Playgroud) c# linq-to-entities entity-framework object-initializers entity-framework-4
尝试更新数据库时,此代码出错
错误:在ObjectStateManager中找不到具有与提供的对象的键匹配的键的对象.验证提供的对象的键值是否与必须应用更改的对象的键值匹配.
public void UpdateAccuralSettings(SystemTolerance updatedObject)
{
_source.SystemTolerances.ApplyCurrentValues(updatedObject);
_source.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 当多个用户访问同一页面时,我在ASP.NET 4网站上收到以下错误消息:
底层提供商未能打开.在System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf等......
我使用Entity Framework 4来访问SQL Server 2008数据库.
页面有时工作,所以我知道连接字符串是正确的.此外,数据库设置为多用户,并且我在连接字符串中将MARS设置为true.
同样在事件查看器中,我有时会收到SQL Server消息:
服务器将断开连接,因为客户端驱动程序在会话处于单用户模式时发送了多个请求.
正如我所说的,只有当我尝试通过刷新页面或单击相同的链接在两台不同的机器上同时访问同一页面时,才会发生这种情况.
任何帮助将非常感激.
添加了连接字符串(第一个用于ASPNETDB,第二个用于主数据库):
<add name="ApplicationServices" connectionString="Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=False;Persist Security Info=False;User ID=****;Password=****;Connect Timeout=120" />
<add name="MyDBEntities" connectionString="metadata=res://*/App_Code.MyDBModel.csdl|res://*/App_Code.MyDBModel.ssdl|res://*/App_Code.MyDBModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=False;User ID=****;Password=****;Connect Timeout=120;User Instance=false;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
我用来访问上下文的类如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MyDBModel;
using System.Web.Security;
/// <summary>
/// Summary description for MyDataAccess
/// </summary>
public static class MyDataAccess
{
// Private Class Members
//-----------------------------------------------------------------------------------------
private static MyDBModel.MyDBEntities dal = new MyDBModel.MyDBEntities();
// Class …Run Code Online (Sandbox Code Playgroud) 在过去,我们的开发团队决定创建一个新的企业应用程序,并决定使用"Linq to SQL",因为实体框架"糟透了".(不是我的意见!)他们使用Visual Studio 2008,EF不是默认设置的一部分,但需要额外的插件.因此决定使用Linq to SQL来访问数据库.因此,我们现在围绕一个包含DBML和L2SQL实体的datamodule类库有多个项目......
现在很明显,这些开发人员错了.一些人转移到其他公司,一些新的公司被包括在这个项目中.(包括我.)我们想要使用实体框架.最好是带有.NET 4.0的版本4 ......这将使我们对数据更加灵活,我们希望在几个实体中包含一些继承,使代码更易于阅读和更好用.
那么,如何从"Linq to SQL"迁移到Entity Framework 4而无需重写我们的大部分代码?
当试图用entityframework查询我的数据库时,我得到以下错误:类型'System.Collections.Generic.IEnumerable 1[[TASK.Warehouses.Domain.NoteProducts.NoteProduct, TASK.Warehouses.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' is not a single implementation of 'System.Collections.Generic.ICollection1 [T]' 的导航属性.可能是什么问题,我怎么能解决它
linq linq-to-entities frameworks linq-to-sql entity-framework-4
有没有人尝试过映射继承的属性?因为我很高兴听到它正常工作并且我在某处犯了错误,因为我收到以下错误:
"属性'UserName'不是'Advertiser'类型的声明属性.通过使用Ignore方法或NotMappedAttribute数据注释验证该属性是否未从模型中显式排除.请确保它是有效的原始属性."
我的模型看起来像这样:
abstract class Entity { public int Id {get; set; }}
abstract class User : Entity { public string UserName {get; set;} }
sealed class Advertiser : User { }
Run Code Online (Sandbox Code Playgroud)
我的AdvertisementConfiguration类看起来像这样:
class AdvertiserConfiguration : EntityTypeConfiguration<Advertiser>
{
public AdvertiserConfiguration()
{
// the following line indirectly causes an InvalidOperationException:
Property( x => x.UserName ).HasMaxLength(50);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我更改广告商类以使其不从User继承(并将UserName属性拉下来),那么一切正常.
entity-framework invalidoperationexception code-first entity-framework-4 ef-code-first
我在过去的几天里一直在阅读有关实体框架的内容,并且设法得到了一个使用它的公平想法,但我仍然有一些问题,其中一些可能看起来有点过于基本.为了透视,我在asp.net Web应用程序中使用实体框架4.0.如果您可以回答任何问题,请继续.
使用POCO模板可以获得什么好处.我理解,如果我希望得到持久性的无知并让我的实体清楚地了解与存储相关的任何信息POCO实体是可行的方法.在使用POCO实体时,我可以相对轻松地从实体框架切换到说NHibernate吗?除了疏松耦合之外,我有任何重要的理由去POCO实体.另外,如果我使用POCO,我最终会失去任何东西.在代理的帮助下,我仍然可以获得更改跟踪和延迟加载?
通常的做法是使用EF模型的实体作为数据传输对象或业务对象.例如,我有一个单独的类库用于我的实体模型.假设我正在使用MVP,我想要一个公司的员工列表.演示者将请求我的业务逻辑函数,该函数将查询实体模型以获取Employee列表,并将实体列表返回给演示者.在这种情况下,我的演示者需要引用EF模型.这是正确的方法吗?在我的asp.net web applciation的情况下,它不应该是一个问题,但如果我使用Web服务,这是如何工作的?这是走向POCO实体的原因吗?
假设Employee实体具有公司表的导航属性.如果我在'using'块中使用并包装数据上下文,并尝试访问BL中的导航属性,我假设我会得到一个异常.如果我关闭延迟加载并使用'include'linq查询获取实体,我是否也会得到异常?在之前的帖子中,有人建议我每个请求使用一个上下文,暗示即使我在BL中,上下文仍保持活动状态.我假设我仍然需要分离对象并将其附加到我的下一个请求的上下文中,如果我希望坚持我做出的任何更改?或者我应该用新的上下文再次查询对象并更新它?
这个问题更多地与组织文件/最佳实践有关,并且是我之前发布的问题的后续问题.当我使用基于实体的单独文件来组织我的数据访问层时,组织涉及多个表之间的连接的查询的最佳实践是什么.我对组织仍然有些模糊.尝试过在网上搜索但没有太多帮助.
我正在用一个实体创建一个非常简单的EF4代码第一个项目.
public class Activity
{
public Guid Id { get; set; }
public string Description { get; set; }
public List<DateTime> DateDone { get; set; }
<snip>
public Activity()
{
if(DateDone==null)
DateDone = new List<DateTime>();
}
}
Run Code Online (Sandbox Code Playgroud)
我重建我的项目,然后运行MVC3应用程序并生成数据库(确认,我已添加和删除列),我的数据是种子(当我修改种子数据时它在屏幕上更改)
我能够:
var activity = db.Activities.Find(id);
activity.DateDone = DateTime.Now;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是数据没有保存.我检查了数据库,因为只有一个表(Activity),它有所有相应的字段.我希望它应该有第二个表,ActivityDateDone有两个字段,ActivityGuid和DateDone.
我在做这项工作时缺少什么?
我已经实现了在http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server上演示的表继承功能.
所有外键和约束都已到位.
现在,我正在使用实体框架来撤回我的人员,学生,教师和家长,其中模型看起来类似于以下内容(没有所有EF特定属性等).
public partial class People : EntityObject
{
public guid PeopleID { get; set; }
public int Age { get; set; } /Added for an example query
public PeopleParent Parent { get; set; }
public PeopleStudent Student { get; set; }
public PeopleTeacher Teacher { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我需要让所有人不分类型,25岁,不超过100条记录,并且我想要包含所有引用的数据.我创建我的EF查询,如:
IQueryable<People> query = Entities.People.Include("PeopleParent")
.Include("PeopleStudent")
.Include("PeopleTeacher");
query.Where(x => x.Age == 25)
.Take(100);
IEnumerable<People> results = query.ToList();
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但是我设置为包含的表/实体集首先创建一个INNER JOIN而不是生成一个LEFT OUTER JOIN,而不是产生正确的结果.
生成的TSQL(根据我的需要不正确):
SELECT …Run Code Online (Sandbox Code Playgroud) 我刚刚上传了一个新版本的代码到我的服务器并得到了这个错误,我无法理解,也不知道如何解决 - 我没有更改datetime2 - 我的代码语法中甚至没有这个词.你知道那是什么意思吗?
执行命令定义时发生错误.有关详细信息,请参阅内部异常
InnerException:System.ArgumentException:正在使用的SQL Server版本不支持数据类型"datetime2".
at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC [] rpcArray,Int32 timeout,Boolean inSchema,SqlNotificationRequest notificationRequest,TdsParserStateObject stateObj,Boolean isCommandProc)
在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)
在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method)
在System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior行为)
在System.Data.Common.DbCommand.ExecuteReader(CommandBehavior行为)
在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)
sql entity-framework entity-framework-4 entity-framework-4.1
c# ×4
asp.net ×2
code-first ×2
linq ×2
linq-to-sql ×2
.net ×1
frameworks ×1
poco ×1
sql ×1
sql-server ×1
t-sql ×1