Articles of entity framework

如何使用EF查询中的函数参数化选择器?

我有一个投影函数,我传递给IQueryable.Select()方法: private static Expression<Func> GetPriceSelector(){ return e => new PriceItem { Id = e.Id, Price = Math.Round(e.Price, 4) }; } 一切正常,但我想像这样参数化: private static Expression<Func> GetPriceSelector(Func formula){ return e => new PriceItem { Id = e.Id, Price = formula(e) }; } 所以我可以称之为 prices.Select(GetPriceSelector(e => Math.Round(e.Price, 4))) 不幸的是,EF抱怨它: LINQ to Entities中不支持LINQ表达式节点类型“Invoke” 如何重写代码让EF快乐?

entity framework查询中string.Trim()的行为

我正在尝试将名称列表复制到SQL Server表中,为此我有一个Entity Framework项目设置。 名称列表具有重复值,并且几个名称的末尾有空格。 我希望只插入表中尚未包含的名称,以及从它们的末尾修剪空格。 看起来相当简单吧? 我的解决方案是: if (!context.Names.Any(n => n.Value == nameToCopy.Trim()) context.Names.Add(nameToCopy.Trim()) NB。 这不是我的确切代码,只是一个例子,所以不必提及我正在修剪两次! 令我惊讶的是,上述方法并不像我预期的那样有效。 我在发现上述语句时发现, if (!context.Names.Any(n => n.Value == nameToCopy.Trim())实际上并不查询nameToCopy的修剪版本 – 几个查询过的名称他们的结尾有空格。 但是,如果我执行以下操作,则按预期工作: string trimmedName = nameToCopy.Trim() if (!context.Names.Any(n => n.Value == trimmedName) context.Names.Add(trimmedName) 任何人都可以解释为什么第一个解决方案不在数据库查询中使用剪裁版本的字符串? 谢谢

使用存储过程这么糟糕吗?

微软经常提供一些方法来简化开发简单易事的方法。 在EFxx中我有一些不喜欢的东西。 首先,为了进行更新,您需要首先加载记录,因此操作变为两步过程,您可能只想更新一个布尔值。 其次,我喜欢存储过程,因为我可以在同一个连接调用中运行10个不同的东西,如果我使用EFxx,我将不得不运行10个单独的数据库调用(如果涉及更新,则需要更多)。 我对MVC EF专家的关注和问题是……使用存储过程这么糟糕吗? 我仍然认为EFxx只是微软让我们更快地开发简单程序的另一种方式,但实际上并不是真正推荐的方式。 任何提示和提示将非常受欢迎,特别是“在EFxx上运行更新的最佳方式是什么”和“存储过程对EFxx不好”的概念。

如何在运行时创建表达式以在具有entity framework的GroupBy()中使用?

我正在构建一个新的扩展方法,它将动态地能够对来自Entity Framework的查询结果进行分组。 我已经能够使用LinqKit构建动态“where”表达式,但这似乎是一个不同的动物。 新扩展方法的预期用法: var results = entities.GroupBy(“someFieldName”).ToList(); 扩展方法定义: public static IQueryable<IGrouping> GroupBy( this IQueryable source, string fieldName) where TEntity : class, IDataEntity { if (string.IsNullOrEmpty(fieldName)) { return new List<IGrouping>().AsQueryable(); } var parameter = Expression.Parameter(typeof(TEntity), “x”); var fieldXExpression = Expression.Property(parameter, fieldName); var lambda = Expression.Lambda<Func>( Expression.Convert(fieldXExpression, typeof(object)), // throws error when using EF parameter); return […]

如何检查修改了哪些属性/条目以及未修改哪些属性/条目在EF 6中编辑记录

我正在使用EF 6开发MVC 5应用程序。编辑的自动生成的POST方法是: public ActionResult Edit([Bind(Include = “Id,Name,Address,Phone,SSNo,D1”)] ABC abc) { if (ModelState.IsValid) { db.Entry(abc).State = EntityState.Modified; db.SaveChanges(); } return View(abc); } 是否有任何过程/方法可以获得哪些条目被修改以及这些条目的原始值是什么。 我已经尝试过在这个问题中标记为答案的方法,但是虽然已经进行了更改,但是它没有得到任何更改,即循环不会迭代。 我的代码是: public ActionResult Edit([Bind(Include = “Id,Name,Address,Phone,SSNo,D1”)] ABC abc) { if (ModelState.IsValid) { db.ABCs.Attach(abc); var myObjectState = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.GetObjectStateEntry(abc); var modifiedProperties = myObjectState.GetModifiedProperties(); foreach (var propName in modifiedProperties) { Console.WriteLine(“Property {0} changed from […]

EntityFramework:急切加载而不是包含?

我的数据模型有很多嵌套实体 ,我想热切地加载整个对象树…除了将按需显式加载的视图实体。 使用包含路径我必须指定许多路径,每次添加新实体时,我都必须调整这些包含路径。 我目前使用我的存储库的以下方法来加载类型的所有实体: public virtual IQueryable All(string commaSeperatedIncludePropertyPaths = “”) { IQueryable initialQuery = Context.Set(); string[] includePaths = commaSeperatedIncludePropertyPaths.Split(new[] { ‘,’}, StringSplitOptions.RemoveEmptyEntries); return includePaths.Aggregate(initialQuery, (currentQuery, includeProperty) => currentQuery.Include(includeProperty)); } 传递的包含路径已经填满整个屏幕。 因此,我希望EntityFramework能够自动加载所有导航属性 ,除了我使用排除路径指定的属性 : public virtual IQueryable All(string commaSeperatedExcludePropertyPaths = “”) { //… how to implement? } 排除路径有助于避免循环依赖,并过滤掉我不想急切加载的少数实体。 指定排除而不是包含会减少样板代码。 这可能是EF 6.1.3还是EF 7的计划? 如果没有,那么选择的原因是什么? 有没有人已经尝试读取实体元数据并将其应用于“自动急切加载”并失败了? 相关(旧)问题和文章: […]

Oracle Entity Framework提供程序不会以毫秒为单位存储DateTime.Now

我和这个家伙基本上有完全相同的问题。 为什么我无法使用Entity Framework保存当前的DateTime.Now 但他使用的是SQL Server,而我正在使用Oracle。 (我的申请必须与两者合作) 他的问题是在数据库级别没有正确设置精度。 我注意到如果我手动编辑我的oracle数据库中的毫秒数,EF可以用毫秒提取正确的时间戳。 但是当我创建一个带有DateTime属性的实体到“DateTime.Now”时,它会被截断。 DateColumn1属性属于Oracle类型Timestamp 我记录了insert语句 insert into “SchemaName”.”TableName”(“DateColumn1”) values (:P0) –:P0:’5/14/2015 4:07:27 PM’ (Type = Date) 疯狂的是,这适用于SQL Server。

同一个表中的两个一对多关系

我有一个名为SystemAccount的表,它(直到最近)有一个MasterAccountID ,它指向其父帐户(显然是一个int? )。 我的客户现在告诉我,有时某个帐户可能有2个父帐户(没有比这更多)。 我一直在尝试在我的SystemAccount类中进行调整,但它没有产生我想要的关系。 这是类代码的一部分: [ForeignKey(“MasterAccount”)] public int? MasterAccountID { get; set; } [ForeignKey(“SecondMasterAccount”)] public int? SecondMasterAccountID { get; set; } public virtual SystemAccount MasterAccount { get; set; } public virtual SystemAccount SecondMasterAccount { get; set; } public virtual List AllSubAccounts { get; set; } public virtual List SecondarySubAccounts { get; set; } 当我这样做时,我在表中获得4个FK,其中2个是自动生成的( […]

在Entity Framework上为NULL值创建UNIQUE过滤索引

我正在尝试使用Entity Framework创建一个具有NULL值的UNIQUE过滤索引的表(例如,允许Null值重复)。 我正在使用Fluent API并拥有此实体属性: modelBuilder.Entity().Property(c => c.Barcode) .HasMaxLength(20) .IsRequired() .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute(“IX_ClientBarcode”) { IsUnique = true })); 我发现SQL Server 2008允许对具有过滤空值的唯一列进行此操作: CREATE UNIQUE INDEX indexName ON tableName(columns) INCLUDE includeColumns WHERE columnName IS NOT NULL 这甚至可以实现吗? 因为我使用的是LocalDB。

C# – 外键引用无效表 – 基本迁移无效

试图用C#创建我的第一个项目。 然而,到目前为止,它非常令人沮丧。 这是一个我无法解决的问题,因为我没有看到任何错误。 我正试图在我的数据库中进行简单的迁移。 用户迁移文件 public override void Up() { CreateTable( “dbo.Users”, c => new { user_id = c.Int(nullable: false, identity: true), first_name = c.String(), last_name = c.String(), email = c.String(), role = c.String(), }) .PrimaryKey(t => t.user_id); } 位置迁移文件 public override void Up() { CreateTable( “dbo.Locations”, c => new { loc_id = c.Int(nullable: false, […]