Tag: entity framework core

entity framework核心:检查通用实体是否已经在dbset中然后添加或更新它的最快方法是什么?

我从CSV文件加载数据,我在运行中创建实体然后将它们添加到List 。 以下代码采用List并将实体添加到右侧DbSet 。 public static void AddEntities(List entities, DbContext db) where T :class { using (db) { var set = db.Set(); foreach(T e in entities) { set.Add(e); } db.SaveChanges(); } } 我想更改它只是在它不存在时添加实体,否则它必须更新它。 使用Entity Framework Core实现此目标的最佳方法是什么? 我相信我应该使用System.Reflection : 获得至少ID,但最好获得dbset的所有密钥 循环遍历键以查找实体是否已在DbSet中 如果找到,则使用新实体的值更新它,否则将其添加到集合中 像这样的东西: public static void AddEntities(List entities, DbContext db) where T :class { using (db) […]

如何在Entity Framework Core中构建多个左连接查询

考虑我有以下实体: public class Root { public long Id { get; set; } } public class School : Root { public long StudentId { get; set; } public Student Student { get; set; } public Teacher Teacher { get; set; } public long TeacherId { get; set; } } public class Student : Root { } […]

如何在asp.net core和ef7中的并行方法中使用注入的DbContext?

我有一个EF7的Asp.net 5 / Core 1应用程序。 我通常在DI容器中注册DbContext。 services.AddEntityFramework().AddSqlServer() .AddDbContext(options => options.UseSqlServer(connection)); 这是一个小样本,展示了我正在尝试做的事情。 public class MyController : Controller { MyDbContext _myDbContext; public MyController(MyDbContext myDbContext) { _myDbContext = myDbContext; } public IActionResult Index() { //Just start these and don’t wait for them to finish //We don’t care if they succeed or not Task.Run(() => DoSomeLogging1()); Task.Run(() => DoSomeLogging2()); […]

entity framework核心InMemory数据库测试在并行运行时中断

在运行所有测试时,我最终会收到错误消息: “已添加具有相同密钥的项目。密钥:125” 每次测试单独运行时都不会发生这种情况。 有趣的是,每个测试使用不同的DbName,以避免任何冲突: [TestMethod] public void Test1() { using (var context = CreateTestingContext()) { … } } [TestMethod] public void Test2() { using (var context = CreateTestingContext()) { … } } protected static SGDTPContext CreateTestingContext([CallerMemberName] string dbName = “TestingDb”) { var builder = new DbContextOptionsBuilder().UseInMemoryDatabase(dbName); return new MyDbContext(builder.Options); } 这真的很奇怪,因为当我单独进行测试时,它们是绿色的! 当我同时运行它们时,有些最终会失败。 注意:我正在使用Visual Studio 2017中集成的MSTest。

EF Core在内存中而不是在SQL中执行GroupBy操作所需的解决方法

我正在使用Entity Framework Core 1.1.0(此时升级不是一个选项,因为在以后的版本中会发生重大变化)。 我的查询格式如下: var q = db.MyTable .GroupBy(t => new { t.Field1 }) .Select(g => new { g.Key.Field1, MaxField2 = g.Max(x => x.Field2) }) .ToList(); 在测试代​​码中,这很好用并返回预期的数据。 但是当使用真实数据部署到真实环境时,它会超时。 为什么? 好吧,我在SQL服务器上放了一个嗅探器,这是实际的SQL: SELECT [t].[Field1], [t].[Field2], [t].[Field3], [t].[Field4], [t].[Field5] FROM [dbo].[MyTable] AS [t] ORDER BY [t].[Field1] 哦。 好吧,这可以解释它。 EF只是将查询编译到.GroupBy()到SQL,因此尝试将表的全部内容(此时写入大约1700万条记录)加载到内存中,其余的分组和排序是假设的在记忆中完成。 有任何建议如何重写这个查询,以便在SQL中完成繁重的工作?

唯一索引约束上的EF Core / Sqlite一对多关系失败

上下文是每个Car都有一个相应的CarBrand 。 现在我的课程如下所示: public class Car { public int CarId { get; set; } public int CarBrandId { get; set; } public CarBrand CarBrand { get; set; } } public class CarBrand { public int CarBrandId { get; set; } public string Name { get; set; } } public class MyContext : DbContext { public […]

在添加Entity Framework Core(1.1.0)迁移时,dotnet exec需要托管的.dll或.exe扩展

错误信息: PM> Add-Migration InitialDatabase dotnet exec needs a managed .dll or .exe extension. The application specified was ‘C:\Users\xxxxxx\documents\visual studio 2017\Projects\TheWorld\src\TheWorld\bin\Debug\netcoreapp1.0\TheWorld.runtimeconfig.json’ Process finished with non-zero exit code PM> Visual Studio版本:2017 RC 项目依赖性: 错误截图:

如何在类库中添加配置文件,后跟.NET Core 1.1的连接字符串

我正在开发n层应用程序,我有数据访问层。 这与任何其他应用程序无关。 我已经为.NET Core 1.1创建了类库,我可以看到依赖项文件夹但不能查看任何config / JSON文件。 我想知道,我可以在类库项目中添加AppSetting.JSON文件吗? 接下来我该如何添加连接字符串。 我知道在DbContext类 – > SQLServerConnection中覆盖ConfigureBuilder但我想保留在单独的配置文件中并引用这些连接字符串。 另请注意,此类库不会直接链接到ASP.NET应用程序 在谷歌搜索时,我发现以下链接https://www.stevejgordon.co.uk/project-json-replaced-by-csproj但我的问题仍然存在,我在哪里以及如何为类库项目添加连接字符串?

如何通过分配新的Collection来更新Many-Many中的Collection?

在entity framework核心2.0中, Post和Category之间有很多关系(绑定类是PostCategory )。 当用户更新Post ,整个Post对象(及其PostCategory集合)将被发送到服务器,在这里我想重新分配新收到的Collection PostCategory (用户可以通过添加新类别和删除来显着更改此Collection一些类别)。 我用来更新该集合的简化代码(我只是分配了全新的集合): var post = await dbContext.Posts .Include(p => p.PostCategories) .ThenInclude(pc => pc.Category) .SingleOrDefaultAsync(someId); post.PostCategories = … Some new collection…; // <<< dbContext.Posts.Update(post); await dbContext.SaveChangesAsync(); 此新集合具有在先前集合中具有相同Id对象的对象(例如,用户删除了一些(但不是全部)类别) 。 因为,我得到一个例外: System.InvalidOperationException:无法跟踪实体类型“PostCategory”的实例,因为已经跟踪了另一个具有{‘CategoryId’,’PostId’}键值的实例。 如何在不获得此exception的情况下有效地重建新集合(或简单地分配新集合)? UPDATE 这个链接中的答案似乎与我想要的有关,但它是一种好的有效方法吗? 有没有更好的方法? 更新2 我得到我的post(编辑覆盖其值),如下所示: public async Task GetPostAsync(Guid postId) { return await dbContext.Posts .Include(p => p.Writer) .ThenInclude(u […]

如何在ASP.net Core中基于环境添加DbContext

这就是我目前在Startup.cs中的ConfigureServices方法中添加DbContext的方法: public void ConfigureServices(IServiceCollection services) { ….. services.AddDbContext(options => options.UseMySQL(Configuration.GetConnectionString(“DefaultConnection”))); ….. } 我的连接字符串存储在我的appsettings.json文件中,例如: { …. “ConnectionStrings”: { “DefaultConnection”: “server=localhost;user id=root;password=root;database=mydb;sslmode=none” } …. } 如果我想切换正在连接的数据库,如果它是“开发”与“生产”环境,如何使“services.AddDbContext()”切换数据库?