精华内容
下载资源
问答
  • c# EF插入数据报错跟踪代码
    2018-07-11 14:36:00

    我们在使用EF进行数据库插入的时候或出现一些插入失败的情况,但是具体是哪个字段不符合数据库设计要求无法得知,普通的try catch 无法捕获加上一下方法就可以

      try
                {
                   。。。。。。
                }
                //可以进行EF执行过程中出错字段定位
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
    。。。。。。
                           
                        }
                    }
              

                }

                catch (Exception e)
                {
               。。。。。。
                }

    转载于:https://www.cnblogs.com/Cruise-Yang/p/9294353.html

    更多相关内容
  • C# EF Attach 与 Entry

    2020-12-24 03:30:06
    先了解一下 EF 框架的 EntityState在使用EF框架时,我们通常都是通过调用 SaveChanges() 方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加、修改还是删除呢?答案是通过EntityState的...

    先了解一下 EF 框架的 EntityState

    在使用EF框架时,

    我们通常都是通过调用 SaveChanges() 方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加、修改还是删除呢?

    答案是通过EntityState的枚举值来判断的。也就是说在操作数据库时,EF会根据EntityState这个枚举检测到实体的状态,然后执行相应的增/删/改操作。

    该状态对应的值为以下五种:

    Detached:对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态;

    Unchanged:自对象加载到上下文中后,或自上次调用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此对象尚未经过修改;

    Added:对象已添加到对象上下文,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法;

    Deleted:使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法从对象上下文中删除了对象;

    Modified:对象已更改,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。

    Attach()  :将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中。

    从解释可以看出Attach方法主要目的就是把一个没有被 dbContext 跟踪的对象附加到 dbCotext 中使其被 dbContext 跟踪。

    Attach执行成功的前提:

    1. 如果上下文中已经存在与实体对象键值相同的对象A,则要求实体对象的内存地址必须与对象A相同,否则报错:“已有相同键值的对象存在上下文中......”。

    2. 如果上下文中不存在与实体对象键值相同的对象,则要求实体对象的内存地址必须不在上下文中,否则会报错,系统认为在修改键值,这是不允许的。

    例如,在删除中使用

    public intDelete(T entity)

    {

    DB.Set().Attach(entity);

    DB.Set().Remove(entity);returnDB.SaveChanges();

    }

    Entry()  :获取实体对象的代理类

    如果实体对象不在当前上下文中(指内存地址),则代理类对象的State为Detached,否则,为上下文中相应所处状态。

    例如:在更新中使用

    public int Updata(T entity,params string[] propNames)

    {var oldEntity =DB.Entry(entity);

    oldEntity.State=EntityState.Unchanged;foreach (var prop inpropNames)

    {

    oldEntity.Property(prop).IsModified= true;

    }returnDB.SaveChanges();

    }

    展开全文
  • } 执行操作,报错信息如下: 查看EntityValidationErrors, 只能看到{System.Data.Entity.Validation.DbEntityValidationResult},没有更详细的信息。 如果将上述代码用try..catch包起来,如下写法: try { //执行...

    以下小编整理的Entity Framework常见错误的汇总,大家如果还有不明白可以在下面留言区讨论。

    1 实体属性配置为IsRequired()对更新的影响

    抛出异常类型DbEntityValidationException

    表结构:

    实体:

    public class User

    {

    public int Id { get; set; }

    ///

    /// 账号

    ///

    public string Account { get; set; }

    ///

    /// 邮箱

    ///

    public string Email { get; set; }

    ///

    /// 昵称

    ///

    public string Nickname { get; set; }

    ///

    /// 头像

    ///

    public string AvatarId { get; set; }

    ///

    /// 记录插入时间

    ///

    public DateTime InsertTime { get; set; }

    ///

    /// 记录修改时间

    ///

    public DateTime UpdateTime { get; set; }

    }

    实体配置:

    modelBuilder.Entity().Property(u => u.Account)

    .IsRequired()

    .IsUnicode(false)

    .HasMaxLength(50);

    modelBuilder.Entity().Property(u => u.Email)

    .IsRequired()

    .IsUnicode(false)

    .HasMaxLength(100);

    modelBuilder.Entity().Property(u => u.Nickname)

    .IsUnicode(false)

    .HasMaxLength(50);

    modelBuilder.Entity().Property(u => u.AvatarId)

    .IsOptional()

    .HasMaxLength(100);

    CustomDbContext继承自DbContext

    [DbConfigurationType(typeof(MySqlEFConfiguration))]

    public class CustomDbContext : DbContext

    {

    public CustomDbContext()

    : base("name=Master")

    {

    this.Configuration.LazyLoadingEnabled = false;

    //DropCreateDatabaseIfModelChanges

    //new DropCreateDatabaseAlways()

    Database.SetInitializer(null);

    }

    public DbSet Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)

    {

    base.OnModelCreating(modelBuilder);

    EntityConfiguration.Set(modelBuilder);

    }

    }

    更新操作:

    using (CustomDbContext db = new CustomDbContext())

    {

    User user = new User

    {

    Id = 1,

    Email = "test@1622.com",

    };

    DbEntityEntry entry = db.Entry(user);

    entry.State = EntityState.Unchanged;

    entry.Property(t => t.Email).IsModified = true;

    int num = db.SaveChanges();

    }

    执行操作,报错信息如下:

    查看EntityValidationErrors,

    只能看到{System.Data.Entity.Validation.DbEntityValidationResult},没有更详细的信息。

    如果将上述代码用try..catch包起来,如下写法:

    try

    {

    //执行代码

    }

    catch (DbEntityValidationException ex)

    {

    var e = ex.EntityValidationErrors;

    }

    catch (Exception ex)

    {

    }

    一层一层地打开,看到真正导致异常的原因,看到下面的截图:

    分析实体配置发现,Account属性被设置为IsRequired,那么在更新实体的时候,即使不更新这个字段,也要给这个字段赋值,那么赋值后观察:

    更新操作代码变为

    using (CustomDbContext db = new CustomDbContext())

    {

    User user = new User

    {

    Id = 1,

    Email = "test@1622.com",

    Account = "a"

    };

    DbEntityEntry entry = db.Entry(user);

    entry.State = EntityState.Unchanged;

    entry.Property(t => t.Email).IsModified = true;

    int num = db.SaveChanges();

    }

    经过上述调整后,更新成功。

    那么换一个思路,将Account属性被设置为IsOptional()是不是也可以呢?

    修改实体配置,将Account属性设置按如下修改,并注掉上面的Account = "a"

    modelBuilder.Entity().Property(u => u.Account)

    .IsOptional()

    .IsUnicode(false)

    .HasMaxLength(50);

    执行测试,更改成功。

    得出结论:在实体配置时,指定了为必选的字段,那么更新操作时,构造实例一定要对必选(IsRequired())字段赋值。

    上述测试中还有一个值得考虑的细节,构造User实例的时候,只对Id,Email进行了赋值,而没有对其他属性进行赋值,那么为什么会成功呢?那么必定是未进行任何设置的实体属性默认是IsOptional()。这跟表结构中的字段类型设置为Not Null有无关联呢,从测试结果看就本类应用无必然联系。

    总结:

    a.实体配置中指定了实体属性为IsRequired(),更新操作构造类的实例时必对此属性赋值。

    b.不进行配置的实体属性默认为IsOptional()

    c.表结构中字段是否为Not Null对上述规则无影响。

    2 更新报错:

    An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

    异常类型:System.Data.Entity.Infrastructure.DbUpdateConcurrencyException

    实体属性配置如上例所示。

    操作代码:

    using (CustomDbContext db = new CustomDbContext())

    {

    User user = new User

    {

    Id = 1,

    Email = "test@132.com",

    };

    DbEntityEntry entry = db.Entry(user);

    entry.State = EntityState.Unchanged;

    entry.Property(t => t.Email).IsModified = true;

    User user1 = new User

    {

    Id = 1,

    Email = "test@132.com",

    };

    DbEntityEntry entry1 = db.Entry(user1);

    entry1.State = EntityState.Unchanged;

    entry1.Property(t => t.Email).IsModified = true;

    int num = db.SaveChanges();

    }

    执行操作

    涉及到两次修改操作,两次操作构造了两个实例,但是实例的属性Id有相同的值。

    如果两次操作的是同一个实例,而不是不同的实例,那么不会抛出异常,代码如下:

    using (CustomDbContext db = new CustomDbContext())

    {

    User user = new User

    {

    Id = 1,

    Email = "test@132.com",

    };

    DbEntityEntry entry = db.Entry(user);

    entry.State = EntityState.Unchanged;

    entry.Property(t => t.Email).IsModified = true;

    DbEntityEntry entry1 = db.Entry(user);

    entry1.State = EntityState.Unchanged;

    entry1.Property(t => t.Email).IsModified = true;

    int num = db.SaveChanges();

    }

    3 未给主键赋值或赋给主键一个不存在的值,抛出异常

    System.Data.Entity.Infrastructure.DbUpdateConcurrencyException

    操作代码如下,其中Id=1这条语句被注掉,Id是主键:

    using (CustomDbContext db = new CustomDbContext())

    {

    User user = new User

    {

    //Id = 1,

    Email = "test@132.com",

    };

    DbEntityEntry entry = db.Entry(user);

    entry.State = EntityState.Unchanged;

    entry.Property(t => t.Email).IsModified = true;

    int num = db.SaveChanges();

    }

    运行上述代码,抛出异常信息如下,注意异常类型居然是System.Data.Entity.Infrastructure.DbUpdateConcurrencyException,看上去像是并发问题,但实际却不是!

    Message:

    Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

    赋给主键一个不存在的值,令Id=4(在数据库表中不存在Id为4的一条记录)抛出的异常与上面的相同。

    4 字段超长抛出异常:System.Data.Entity.Validation.DbEntityValidationException

    表中Nickname 字段定义为50个字符,现在赋值超过50。

    操作代码如下:

    using (CustomDbContext db = new CustomDbContext())

    {

    User user = new User

    {

    Id = 4,

    Email = "test@132.com",

    Nickname = "TestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateError"

    };

    DbEntityEntry entry = db.Entry(user);

    entry.State = EntityState.Unchanged;

    entry.Property(t => t.Email).IsModified = true;

    int num = db.SaveChanges();

    }

    运行程序报错:

    一层一层点开,查看具体原因:

    展开全文
  • 报错: 原因分析: 错误提示的意思是:我的lastAskTime字段是自增的,所以我不能修改他的值,但是datetime类型也不能设置自增啊? 尝试数据库直接用sql更新,没问题,那基本锁定是EF的问题了,但是能力有限,...

    报错:

    在这里插入图片描述


    原因分析:

    错误提示的意思是:我的lastAskTime字段是自增的,所以我不能修改他的值,但是datetime类型也不能设置自增啊? 尝试数据库直接用sql更新,没问题,那基本锁定是EF的问题了,但是能力有限,并没有找出什么原因。

    解决方案:

    最后发现,把lastAskTime字段的默认值“CURRENT_TIMESTAMP”去掉或改为一个固定值(重新生成项目中的数据库实例)就不再报错了。
    在这里插入图片描述




    搞不明白,这个默认值应该只是新建行时起效果,EF为啥在更新时要把它判断为是个自增字段?

    展开全文
  • 0由于对c#EntityFramework的了解还不够,滥用EF,导致我在写一个c#窗体项目的时候,遇到了这个问题并让我花费了大量的时间去修改。写下此文来记录我犯的错误。我的项目场景是:winfrom窗体程序,允许许多客户端同时...
  • 加入主外键设置 . 然后数据库因为增加数据,需要重新都生成模型。
  • EF查询报错问题

    2020-05-26 14:55:53
    EF查询报错 “The LINQ expression node type ‘Invoke’ is not supported in LINQ to Entities.” 执行语句: Func<User, bool> fun = (u) => { return !u.IS_Delete && u.Account.Equals...
  • 1 C# EF 执行修改操作时,由于外键约束,导致操作失败。 1.1 报错内容:“UPDATE 语句与 CHECK 约束"CK_States_EnableSelect"冲突。该冲突发生于数据库”,表。\r\n语句已终止。"} 1.2 解决方法: 1.2.1 找到数据库...
  • C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案---修改步骤---1.打开Nuget管理包,把Mysql.Data替换为6.10.0以下任意版本。这里选择的是6.8.82.修改完毕后,继续把Mysql.Data.Entity也修改为对应...
  • Entity Framework Code First Migration Error NUGET已经是能升到的最新的版本了 **EntityFramework 6.4.4 VS 2010 Nuget 2.1.1 ** PM> enable-migrations enable-migrations : 不能对 Null 值表达式调用方法。...
  • 检查下数据库表字段给的空间够不够 我出现这个问题是填入的数据大于表字段的给的空间 解决办法:把表字段空间给大点就可以了
  • 2 问题复现     下面使用一个 Demo 程序来演示 EF 如何访问 SQLite 数据库,同时演示问题复现以及如何解决如下报错问题: Unable to determine the DbProviderFactory type for connection of type 'System....
  • 在使用Linq 读EF进行两个数据库查询时出现如下错误 指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。 解决方法 在对应查询加上 .AsEnumerable() 即可 ...//报错 var query = (from A in db1.Table jo...
  • 我用ef的SaveChanges(); 更新时报错 以下我转换的两种方式 都能转换成功 但还是报错 1.long zhu_id= Convert.ToInt64(txt_id.Text ); zhu_update.ID = zhu_id; 2.zhu_update.ID=Convert.ToInt64(txt_id.Text ); 此ID...
  • 『异常处理·EF·准备命令定义时发生错误。有关详细信息,请参阅内部异常』 编写人 | SCscHero 编写时间 | 2021/7/11 AM1:5 文章类型 | 系列 完成度 | 已完成 座右铭 每一个伟大的事业,都有一个...
  • .net C# EF CodeFirst 新增表和字段

    千次阅读 2021-02-02 14:15:46
    我运营的一个项目后台是用EF CodeFirst操作数据库,因此摸索了一点点经验,分享一下. 添加字段或表: 新增表和字段有两种方法 1、直接修改模型,然后执行命令:add-migration AddMigName,迁移生成的类中会自动包含...
  • C# 在调用mysql.data.dll连接本地数据库时正常,连接远程Linux服务器上的mysql服务器报错 报错记录,当前连接字符串 System.Security.Authentication.AuthenticationException: Authentication to host ‘xxx.xxx....
  • C# EF框架(一)配置

    千次阅读 2020-05-22 14:12:39
    EF EF简介 相关知识复习 lambda表达式 集合常用扩展方法 高级集合扩展方法 EF 的安装 EF 简单DataAnnotations 实体配置 EF 模型的两种配置方式 FluentAPI 配置T_Persons 的方式 EF 的基本增删改查 EF ...
  • EF LINQ SUM方法报错

    2020-11-24 14:14:46
    初次使用SUM方法的时候出现错误,代码如下 decimal totalSalary=_db.Users.Where(x=>x.Age>35).Sum(x=>x.Salary); ...不能将 Null 值赋给类型为 System.Decimal ...因为当Where条件筛选不出来任何数据的时候...
  • 上一篇 C#EF Core框架】使用乐观锁处理并发冲突https://blog.csdn.net/lichao19897314/article/details/122881049 下一篇 C#EF Core框架】实现高效查询...事务允许以原子方式处理多个数据库操作。...
  • 1,最近自学MVC+EF 框架中出现了一个错误,我定义了一个Model类型huodong(在数据库中表名称为huodongs),并且定义了一个huodong的子类HD继承它,如下 public class huodong { public int Id { get; set; } ...
  • 解决C# EF生成Mysql实体模型时的参数错误问题问题描述及网上常规解决方案解决方案 问题描述及网上常规解决方案 利用EF 对数据库表生成C#实体模型及对应关系,能使数据库操作变得非常简单,从而显著减少开发人员的...
  • 今天使用ef6.0连接mysql ,报错如下:Guid 字符串只应包含十六进制字符。从存储区提供程序的数据读取器中进行读取时出错。有关详细信息,请参阅内部异常。在 System.Data.Entity.Core.Common.Internal....
  • 使用cmd对象更新数据,参数的绑定顺序要和SQL中参数出现的顺序一致,否则不会更新成功。并且不会报错。所以更新和插入数据应该根据SQL分别设置绑定参数的顺序。
  • C# EF6框架连接postgresql数据库

    千次阅读 2019-10-31 20:51:47
    准备工作:postgresql 9.2版本;...至此,C# EF6框架连接postgresql数据库完成。 本文参考链接并予以感谢: https://blog.csdn.net/danger_z/article/details/80466350 https://www.bbsmax.com/A/q4zVRbgGzK/
  • 假设您没有要更新的导航属性,EF已经提供了一种无需使用Automapper即可映射属性的方法: public bool UpdateEmployee(Employee employee) { var entity = _dbContext.Employees.Where(c => c.Id == employee.Id)....
  • EF的版本对应关系要求很严格,版本不兼容的时候在VS操作会出现无响应但是也没有任何报错的情况。 类型 环境/组件 版本 系统安装 MySQL Connector Net 8.0.22 系统安装 MySQL for Visual Studio 1.2.9 ...
  • 配置 <?xml version="1.0" encoding="utf-8"?...provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers>
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行...
  • C# EF框架(二)延迟加载

    2020-05-22 14:12:52
    C#6.0 语法 ORM ORM简介 ORM的工作原理 ORM的优缺点 延迟加载(LazyLoad) 如果public virtual Class Class { get; set; }(实体之间的关联属性又叫做“导航属性(Navigation Property)”)把virtual 去掉,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,775
精华内容 1,110
关键字:

c# ef报错

c# 订阅
友情链接: sbjishu.rar