我正在使用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问题,或者设计问题不好.
有没有经历过这样的事情?
编辑: …
所以我使用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) 每当我们想使用IEnumerable扩展方法而不是IQueryable版本时,我们都使用AsEnumerable()方法.
var list = context.Details.AsEnumerable().Where(x => x.Code == "A1").ToList();
Run Code Online (Sandbox Code Playgroud)
为什么DbSet使用IQueryable版本的方法默认情况下,其他版本可用时(Where,Select,...)?
我有以下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 ?
我们为我的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
我的数据访问实现如下,并且正在运行
- Contexct继承自DB Context
- 有OnModelCreating配置
- 手动添加配置
但是我修改了我的背景下inherit,从IdentityDbContext<ApplicationUser>和停止手动生成的配置,之后的OnModelCreating失败,数据库更新不会发生的.
如果我删除它OnModelCreating,它工作正常.我一运行应用程序.
任何人都可以指导我这里出错吗?
我有数据库和多个表,我在我的项目中使用EF代码第一种方法.
在某些时候,我需要更改数据库中某些或所有表的名称.
在代码优先方法中实现它的最佳方法是什么?
我正在开发一个使用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="data source=.;initial catalog=Awais;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
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
我正在尝试使用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.
任何人有任何想法我该怎么办?
我有一个现有的数据库,我试图用它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) ef-code-first ×10
c# ×6
linq ×2
.net ×1
asp.net-mvc ×1
database ×1
ienumerable ×1
iqueryable ×1
migration ×1
mysql ×1