标签: dbcontext

IDbSet.Add和DbEntityEntry.State = EntityState.Added有什么区别?

在EF 4.1+中,这两行代码之间有区别吗?

dbContext.SomeEntitySet.Add(entityInstance);
dbContext.Entry(entityInstance).State = EntityState.Added;
Run Code Online (Sandbox Code Playgroud)

或者他们做同样的事情?我想知道是否可能会影响子集合/导航属性与另一个不同.

c# entity-framework-4.1 dbcontext

15
推荐指数
1
解决办法
2958
查看次数

我需要在OnModelCreating(DbModelBuilder模型构建器)函数中添加什么来定义Person和Role之间的关系?

我在WinForms项目中使用EntityFramework 5.0版,.net 4.5.

我为我创建了2个重要的实体

    public class Role
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Name { get; set; }
        public bool StockPermission { get; set; }
        public bool ItemPermission { get; set; }
        public bool OrderPermission { get; set; }
        public bool PersonPermission { get; set; }
        public bool StatisticPermission { get; set; }
    }

    public class Person
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public String Name { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework dbcontext entity-framework-5

15
推荐指数
1
解决办法
6万
查看次数

获取"实体类型<model>不是当前上下文模型的一部分."

我在使用web api在asp.net中一次更新我的数据库1列时遇到此问题.我试图查询PUT只更新行中的一个值而不是更新那个值并将其余值设置为null.我在控制器之外做了一个单独的模型来接受更新,所以我可以一次做一个.当我db.Entry(user).State = EntityState.Modified;在控制器中点击该行时,它出错了.有什么建议我怎么解决这个问题?

这是我在put方法中使用的单独的ViewModel:

namespace WebAPI.Models.ViewModels
{
    public class UserViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器在我的参数中使用ViewModel调用方法:

public HttpResponseMessage PutUser(int id, UserViewModel user)
        {
            HttpResponseMessage response;

            if (db.User.IsInRole("Admin"))
            {
                try
                {
                        db.Entry(user).State = EntityState.Modified;
                        db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UserExists(id))
                    {
                        response = new HttpResponseMessage(HttpStatusCode.NotFound);
                        return response;
                    }
                    else
                    {
                        throw;
                    }
                }

                response = new HttpResponseMessage(HttpStatusCode.NoContent);
                return response;
            }
Run Code Online (Sandbox Code Playgroud)

这是我的DBContext档案:

public partial …
Run Code Online (Sandbox Code Playgroud)

c# asp.net entity-framework put dbcontext

15
推荐指数
3
解决办法
7万
查看次数

将 Entity Framework Core 3.1 与 ServiceProvider 中的 UseInMemoryDatabase 选项一起使用(范围生命周期)

我已将 Web 应用程序项目从 .NET Core 2.1 迁移到 3.1(也将 EF Core 从 2.1.1 迁移到 3.1.0)。

迁移后,一些单元测试不再工作,抛出重复键数据库异常。

我模拟了这个问题,并意识到带选项的 EF 核心UseInMemoryDatabase在 3.1 中的行为有所不同,它不会清理旧数据。

在第二种测试方法中,People表已经包含从第一个测试添加的数据,这在 2.1 中没有发生

有谁知道如何使内存数据库适用于每个单元测试?

这是我的测试代码:

AppDbContext.cs

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;

namespace MyConsoleApp.Database
{
    public class AppDbContext: DbContext
    {
        protected AppDbContext(DbContextOptions options) : base(options) { }

        public AppDbContext(DbContextOptions<AppDbContext> options) : this((DbContextOptions)options)
        {
        }

        public virtual DbSet<Person> Person { get; set; }
    }

    public class Person
    {
        [Key]
        public int Id { …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing dbcontext entity-framework-core .net-core-3.1

14
推荐指数
3
解决办法
2万
查看次数

在 ASP.NET Core 3.1 中设置值比较器

我在我的 DBContext 中使用了“HasConversion”来定义一个 JSonArray(语言/值)并将它保存为一个文本字段,它的作用就像一个魅力,我在我的解决方案中添加了一个新项目,没有任何改变,但后来我得到了添加有关“设置值比较器”的迁移的新错误。

我的模型是这样的:

    public class Brand
    {
        public int Id { get; set; }
        public new IList<LangValue> Name { get; set; } = new List<LangValue>();
    }
Run Code Online (Sandbox Code Playgroud)

DBContext就像:

    modelBuilder.Entity<Brand>(t =>
    {

        t.Property(p => p.Name).HasConversion(
            v => JsonConvert.SerializeObject(v, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include}),
            v => JsonConvert.DeserializeObject<IList<LangValue>>(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include})
         );
    });
Run Code Online (Sandbox Code Playgroud)

它运行良好,但在添加新项目后,我在添加迁移时出现黄色错误,并且模型未添加到新数据库中。

Microsoft.EntityFrameworkCore.Model.Validation[10620] 实体类型“品牌”上的属性“名称”是具有值转换器但没有值比较器的集合或枚举类型。设置值比较器以确保正确比较集合/枚举元素。

data-conversion dbcontext asp.net-core jsonconverter entity-framework-core-3.1

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

DbContext不会保持连接打开以便重复使用

我正在尝试重用现有的数据库连接,以便我可以使用TransactionScope不调用MSDTC 来执行多个数据库操作.

实体框架(使用DbContext4.1版本中的新API)似乎不希望保持明确打开的连接打开.旧的ObjectContextAPI保持连接按预期打开并记录.

由于DbContextAPI只是ObjectContext在引擎盖下使用,我预计会有同样的行为.有谁知道这个改变是有意还是已知问题?我无法在任何地方找到它.

public void ConnectionRemainsOpen()
{
    using (var context = new TestDataContext())
    {
        try
        {
            Assert.AreEqual(ConnectionState.Closed, context.Database.Connection.State);

            context.Database.Connection.Open();

            var firstRecord = context.Table3.FirstOrDefault();

            // this Assert fails as State == ConnectionState.Closed
            Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State);

            var newRecord = new Table3
            {
                Name = "test",
                CreatedTime = DateTime.UtcNow,
                ModifiedTime = DateTime.UtcNow
            };

            context.Table3.Add(newRecord);

            context.SaveChanges();

            // this Assert would also fail
            Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State);
        }
        finally
        {
            if (context.Database.Connection.State == ConnectionState.Open)
                context.Database.Connection.Close(); …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-4.1 dbcontext

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

实体框架,代码优先,更新与独立协会的"一对多"关系

找到下面描述的场景的解决方案花了我太长时间.看似简单的事情应该被证明是相当困难的.问题是:

使用实体框架4.1(代码优先方法)和"独立关联"如何在"分离"场景(在我的案例中为Asp.Net)中为现有的"多对一"关系分配不同的结尾.

该模型:

我意识到使用ForeignKey关系而不是独立关联可能是一个选项,但我喜欢在我的Pocos中没有ForeignKey实现.

客户有一个或多个目标:

    public class Customer:Person
{
    public string Number { get; set; }
    public string NameContactPerson { get; set; }
    private ICollection<Target> _targets;

    // Independent Association
    public virtual ICollection<Target> Targets
    {
        get { return _targets ?? (_targets = new Collection<Target>()); }
        set { _targets = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

目标有一个客户:

    public class Target:EntityBase
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Note { get; set; }
    public virtual …
Run Code Online (Sandbox Code Playgroud)

entity-framework associations code-first dbcontext

13
推荐指数
1
解决办法
1万
查看次数

为什么在使用ADO.NET Entity数据模型映射数据库表时,Entity Framework会自动使用ObjectContext而不是DbContext

我首先遵循数据库方法; 我在SQL Server 2008数据库中创建了表,然后使用ADO.NET实体数据模型将这些表映射到Entity Framework类.但是当我打开designer.cs文件时,我在自定义的类定义中找到了以下代码:

public partial class PortalEntities : ObjectContext
Run Code Online (Sandbox Code Playgroud)

所以我有以下三个让我困惑的问题:

  1. 为什么我的PortalEntities班级来自ObjectContext而不是DbContext我期望的?

  2. ObjectContext&之间是否存在重大差异DbContext,或者它们主要相同并提供相同的功能

  3. 当我尝试编写类似于以下代码的内容时:

    Student student = db.Students.Find(id);
    
    Run Code Online (Sandbox Code Playgroud)

我发现我不能使用.Find(),因为我曾经用做方法DbContext,那么,这是否意味着,ObjectContextDbContext有,我可以用不同的方法?

BR

asp.net entity-framework objectcontext asp.net-mvc-3 dbcontext

13
推荐指数
1
解决办法
7999
查看次数

为什么调试模式下DbContext.SaveChanges要慢10倍

有人可以解释一下

  1. 为什么DbContext.SaveChanges在调试模式下比生产模式慢~10倍?
  2. 有什么方法可以加快速度吗?

在调试模式下,如果我在没有调试的情况下启动项目,我的网页加载时间为116秒,而加载时为15秒.

我已经设置了跟踪语句,并确定在调试模式下,在我的DbContext.SaveChanges方法中花费了大约116秒.

运行项目而不调试在同一部分中花费7秒钟.

如果您想了解更多信息,请在评论中告诉我.

项目设置:

  • ASP.NET网页
  • VS2012
  • SQLServer2012
  • 实体框架5.0

附加信息:(如果您需要更多,请在评论中告诉我)

  • SaveChanges方法的累积sql查询数为20,000
  • 生产连接字符串:数据源= PC-DEV;初始目录= aspnet-2013-06-04;集成安全性= True; MultipleActiveResultSets = True;应用程序名称= EntityFrameworkMUE
  • Debug Connection String:Data Source = PC-DEV; Initial Catalog = aspnet-2013-06-04; Integrated Security = True; MultipleActiveResultSets = True; Application Name = EntityFrameworkMUE
  • 我也经历过与LocalDB相同的相对性能作为支持数据库

更新:

正如@ruionwriting建议的那样,我描述了数据库,我发现,无论项目是在调试模式还是生产模式下运行,~2,000 sql命令都会花费相同的时间.(每个命令0毫秒).

但是,在调试模式下,20,000个命令之间的平均绝对时间差为5ms.

与生产模式相比,该组命令的平均时间差为0.3 ms.

这是大约10倍的时间性能差异,并将实体框架隔离为在调试模式下花费额外时间.

有没有办法配置调试版本,以便可以在没有调试标志的情况下引用EntityFramework?

如果我以某种方式通过一些编译器魔术来实现性能,那么在调试功能方面我会失去什么?目前我无法进入实体框架代码,所以我认为我不会错过任何东西.

谢谢!

asp.net performance intellitrace dbcontext entity-framework-5

13
推荐指数
1
解决办法
3137
查看次数

管理dbContext的生命周期

我想将dbContext的生命周期与会话的生命周期联系起来,例如 - 能够在多个请求上提交或放弃对dbcontext上的一组突变的更改.

有没有其他(更好?)方法来实现这一目标?如果不是,那么创建和处理上下文的合适机制是什么?我正在考虑在会话结束时使用清理的静态哈希表,但也许我正在做它所有错误.我也在考虑只关注那些必须在多个请求上工作的上下文,并保持其余的每个操作的想法.有什么建议?

entity-framework dbcontext asp.net-mvc-4

12
推荐指数
1
解决办法
9152
查看次数