标签: ef-code-first

EF LINQ ToList非常慢

我正在使用ASP NET MVC4.5和EF6代码优先迁移.

我有这个代码,大约需要6秒钟.

var filtered = _repository.Requests.Where(r => some conditions); // this is fast, conditions match only 8 items
var list = filtered.ToList(); // this takes 6 seconds, has 8 items inside
Run Code Online (Sandbox Code Playgroud)

我认为这是因为关系,它必须在内存中构建它们,但事实并非如此,因为即使我返回0字段,它仍然很慢.

var filtered = _repository.Requests.Where(r => some conditions).Select(e => new {}); // this is fast, conditions match only 8 items
var list = filtered.ToList(); // this takes still around 5-6 seconds, has 8 items inside
Run Code Online (Sandbox Code Playgroud)

现在请求表非常复杂,关系很多并且有大约16k项.另一方面,筛选后的列表应该只包含8个项目的代理.

为什么ToList()方法这么慢?我实际上认为问题不在ToList()方法中,但可能是EF问题,或者设计问题不好.

有没有经历过这样的事情?

编辑: …

.net c# linq entity-framework ef-code-first

2
推荐指数
1
解决办法
6514
查看次数

代码优先不创建表

所以我使用Entity Framework Code First在现有的远程SQL Server数据库中创建表,当我这样做时:

Enable-Migrations
Add-Migration Inital
Update-Database
Run Code Online (Sandbox Code Playgroud)

不会创建任何表.这是我的DbContext:

using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using TrabalhoDefinitivo.Models;
using TrabalhoDefinitivo.ViewModels;

namespace TrabalhoDefinitivo.DAL
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<Sale> Sales { get; set; }
        public DbSet<Album> Albums { get; set; }
        public DbSet<AlbumType> AlbumTypes { get; set; }
        public DbSet<SaleAlbum> SaleAlbums { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试在Web.config中添加一个新的连接字符串manuall:

<add name="ApplicationServices"
         connectionString="Data Source=gandalf.dei.isep.ipp.pt\sqlexpress;
            Initial Catalog=xxxx;
            User ID=xxxx;
            Password=xxxx"
         providerName="System.Data.SqlClient" …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first ef-migrations

2
推荐指数
1
解决办法
2202
查看次数

为什么DbSet <t> .Where()默认使用IQueryable版本?

每当我们想使用IEnumerable扩展方法而不是IQueryable版本时,我们都使用AsEnumerable()方法.

var list = context.Details.AsEnumerable().Where(x => x.Code == "A1").ToList();
Run Code Online (Sandbox Code Playgroud)

为什么DbSet使用IQueryable版本的方法默认情况下,其他版本可用时(Where,Select,...)?

c# linq ienumerable iqueryable ef-code-first

2
推荐指数
1
解决办法
263
查看次数

实体框架中基本实体的流畅配置

我有以下BaseEntity

public class BaseEntity
{
    public BaseEntity()
    {
        DateCreated = DateTime.UtcNow;
        DateModified = DateTime.UtcNow;
    }

    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }

    [MaxLength(36)]
    public string CreateUserId { get; set; }

    [MaxLength(36)]
    public string ModifyUserId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我所有的其他实体都来自它.现在我想使用流畅的配置而不是DataAnnotations.我是否真的必须在每个DbModelBuilder配置中配置两个字符串属性的MaxLength ?

c# entity-framework ef-code-first ef-fluent-api

2
推荐指数
1
解决办法
1132
查看次数

在EF迁移期间更改数据库选项

我们为我的dataaccess层启用了一些POCO类和迁移,我们创建了一个初始迁移 - 注意我们使用CreateDatabaseIfNotExist数据库初始化.

但是在数据库中我希望有一个使用SQL Filestream的MessageBody字段,因为文件流的EF限制 - 我们尝试在迁移脚本中手动完成.

我们执行以下sql命令.

Sql("alter table [msg].[Message] add [MessageBody] varbinary(max) FILESTREAM not null");
Run Code Online (Sandbox Code Playgroud)

但我必须设置文件流选项 文件流选项

所以我想在迁移期间/之前执行以下命令.

ALTER DATABASE CURRENT SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL)
Run Code Online (Sandbox Code Playgroud)

但是当添加这个bedore时,表的创建我得到错误:多语句事务中不允许ALTER DATABASE语句.

当您想自动创建数据库时,调整数据库选项的最佳方法是什么?是否有可能在进程执行实际迁移之前拦截迁移进程以执行某些sql?

database migration entity-framework ef-code-first sqlfilestream

2
推荐指数
1
解决办法
805
查看次数

当Context从IdentityDbContext继承时,OnModelCreating失败

我的数据访问实现如下,并且正在运行

  1. Contexct继承自DB Context
  2. 有OnModelCreating配置
  3. 手动添加配置

但是我修改了我的背景下inherit,从IdentityDbContext<ApplicationUser>和停止手动生成的配置,之后的OnModelCreating失败,数据库更新不会发生的.

如果我删除它OnModelCreating,它工作正常.我一运行应用程序.

任何人都可以指导我这里出错吗?

ef-code-first asp.net-identity-2

2
推荐指数
1
解决办法
500
查看次数

在代码中首先重命名DB中的表

我有数据库和多个表,我在我的项目中使用EF代码第一种方法.

在某些时候,我需要更改数据库中某些或所有表的名称.

在代码优先方法中实现它的最佳方法是什么?

entity-framework ef-code-first

2
推荐指数
1
解决办法
4216
查看次数

上下文正在Code First模式中使用,其代码是从EDMX文件生成的

我正在开发一个使用EF 6数据库第一种方法的MVC 5应用程序.现在我希望我的DbContext基于不同的用户访问多个数据库.为此,我在Web.Config文件中生成了一个连接字符串:

string str = u.Users.Where(x => x.UserName == HttpContext.User.Identity.Name).First().ConnStr;
var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");          
ConnectionStringSettings c = new ConnectionStringSettings();    
c.ConnectionString = str;
c.Name = u.Users.Where(x => x.ConnStr == str).First().DbName;
c.ProviderName = "System.Data.SqlClient";
section.ConnectionStrings.Add(c);
configuration.Save();
Run Code Online (Sandbox Code Playgroud)

配置文件中生成的连接字符串是:

<add name="Awais123" connectionString="Data Source=.;Initial Catalog=Awais123;integrated security=True;MultipleActiveResultSets=True"
      providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

我制作EDMX时由EF生成的连接字符串是:

<add name="ABCEntities" connectionString="metadata=res://*/Models.awais.csdl|res://*/Models.awais.ssdl|res://*/Models.awais.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Awais;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
      providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

然后我重载了我的Entities构造函数:

public ABCEntities(string nameorConnString) : base(nameorConnString) {}
Run Code Online (Sandbox Code Playgroud)

默认的构造函数是:

public ABCEntities() : base("name=ABCEntities") {}
Run Code Online (Sandbox Code Playgroud)

现在我在另一个.cs文件中声明另一个DbContext类来生成数据库:

public partial class NewDbGen : DbContext
{ …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework ef-code-first ef-database-first

2
推荐指数
1
解决办法
6057
查看次数

第一次迁移时实体框架代码首先是+ mysql System.NullReferenceException

我正在尝试使用MySQL数据库(ef代码第一种方法,VS 2013专业版).我按照这些说明操作.

我的问题是,在启用迁移后,我无法进行首次迁移.我使用命令Add-migration migrationName,我收到一个错误:

"System.NullReferenceException:对象引用未设置为对象的实例.在MySql的System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection连接)的MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection连接)处.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(DbConnection连接)...

你调用的对象是空的.".

我试图以这种方式解决它.但现在我发现了这个:

"这可能是因为没有为您正在使用的方案指定必需参数.例如,指定连接字符串而不指定提供程序名称."

所以问题可能出在我的连接字符串中.

我有来自VS> Server Explorer的连接字符串,我的数据库有"活动"连接.我查看了连接属性并将连接字符串复制到我的web.config中.

在我的项目中引用了MySql.Data,MySql.Data.Entity.EF6和MySql.Web.

任何人有任何想法我该怎么办?

c# mysql entity-framework ef-code-first ef-migrations

2
推荐指数
2
解决办法
3814
查看次数

EF Code First从DB不为所有表创建实体

我有一个现有的数据库,我试图用它Entity Framework Code First From Database来生成C#实体.为此,我Add -> New Item -> ADO.NET Entity Data Model -> Code First from database在Visual Studio 2015中进行操作.当我Entity Data Model Wizard查看时,我看到每个表都被选中,但是当导入完成某些未创建的表的实体时.我已经尝试过两次并且双重检查确实选择了没有实体的表进行导入.导入过程中不会抛出任何错误,因此我不确定为什么有些表缺少权限.可能出现什么问题,如何为每个选定的表获取实体?

SQL为缺少的表之一创建表代码:

CREATE TABLE [dbo].[ProgramControl] (
    [CodeName]    VARCHAR (80) NULL,
    [CodeValue1]  VARCHAR (50) NULL,
    [CodeValue2]  VARCHAR (50) NULL,
    [CodeValue3]  VARCHAR (50) NULL,
    [CodeValue4]  VARCHAR (50) NULL,
    [Description] TEXT         NULL
);
Run Code Online (Sandbox Code Playgroud)

c# ef-code-first entity-framework-6

2
推荐指数
1
解决办法
2932
查看次数