C#中Entity Framework常见报错汇总

C#中Entity Framework常见报错汇总,第1张

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

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

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

抛出异常类型DbEntityValIDationException

表结构:

实体:

public class User  {    public int ID { get; set; }    /// <summary>    /// 账号    /// </summary>    public string Account { get; set; }    /// <summary>    /// 邮箱    /// </summary>    public string Email { get; set; }    /// <summary>    /// 昵称    /// </summary>    public string Nickname { get; set; }    /// <summary>    /// 头像    /// </summary>    public string AvatarID { get; set; }    /// <summary>    /// 记录插入时间    /// </summary>    public DateTime InsertTime { get; set; }    /// <summary>    /// 记录修改时间    /// </summary>    public DateTime UpdateTime { get; set; }  }

实体配置:

       modelBuilder.Entity<User>().Property(u => u.Account)        .Isrequired()        .IsUnicode(false)        .HasMaxLength(50);      modelBuilder.Entity<User>().Property(u => u.Email)        .Isrequired()        .IsUnicode(false)        .HasMaxLength(100);      modelBuilder.Entity<User>().Property(u => u.Nickname)        .IsUnicode(false)        .HasMaxLength(50);      modelBuilder.Entity<User>().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<CustomDbContext>()      Database.Setinitializer<CustomDbContext>(null);    }    public DbSet<User> 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<User> entry = db.Entry<User>(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,Account = "a"          };          DbEntityEntry<User> entry = db.Entry<User>(user);          entry.State = EntityState.Unchanged;          entry.Property(t => t.Email).IsModifIEd = true;          int num = db.SaveChanges();        }    

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

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

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

modelBuilder.Entity<User>().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<User> entry = db.Entry<User>(user);          entry.State = EntityState.Unchanged;          entry.Property(t => t.Email).IsModifIEd = true;          User user1 = new User          {            ID = 1,};          DbEntityEntry<User> entry1 = db.Entry<User>(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,};          DbEntityEntry<User> entry = db.Entry<User>(user);          entry.State = EntityState.Unchanged;          entry.Property(t => t.Email).IsModifIEd = true;          DbEntityEntry<User> entry1 = db.Entry<User>(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,};          DbEntityEntry<User> entry = db.Entry<User>(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,Nickname = "TestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateErrorTestUpdateError"          };          DbEntityEntry<User> entry = db.Entry<User>(user);          entry.State = EntityState.Unchanged;          entry.Property(t => t.Email).IsModifIEd = true;          int num = db.SaveChanges();        }

运行程序报错:

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

总结

以上是内存溢出为你收集整理的C#中Entity Framework常见报错汇总全部内容,希望文章能够帮你解决C#中Entity Framework常见报错汇总所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存