亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中Entity Framework常見報錯匯總

2019-10-29 21:07:51
字體:
來源:轉載
供稿:網友

以下小編整理的Entity Framework常見錯誤的匯總,大家如果還有不明白可以在下面留言區討論。

1 實體屬性配置為IsRequired()對更新的影響

拋出異常類型DbEntityValidationException

表結構:

C#,Entity,Framework,常見報錯

實體:

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();}

執行操作,報錯信息如下:

C#,Entity,Framework,常見報錯

查看EntityValidationErrors,

只能看到{System.Data.Entity.Validation.DbEntityValidationResult},沒有更詳細的信息。

如果將上述代碼用try..catch包起來,如下寫法:

try{//執行代碼}catch (DbEntityValidationException ex){  var e = ex.EntityValidationErrors;}catch (Exception ex){}

一層一層地打開,看到真正導致異常的原因,看到下面的截圖:

C#,Entity,Framework,常見報錯

分析實體配置發現,Account屬性被設置為IsRequired,那么在更新實體的時候,即使不更新這個字段,也要給這個字段賦值,那么賦值后觀察:

更新操作代碼變為

 

        using (CustomDbContext db = new CustomDbContext())        {          User user = new User           {            Id = 1,            Email = "test@1622.com",            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,            Email = "test@132.com",          };          DbEntityEntry<User> entry1 = db.Entry<User>(user1);          entry1.State = EntityState.Unchanged;          entry1.Property(t => t.Email).IsModified = true;          int num = db.SaveChanges();        }  

執行操作

C#,Entity,Framework,常見報錯

涉及到兩次修改操作,兩次操作構造了兩個實例,但是實例的屬性Id有相同的值。

如果兩次操作的是同一個實例,而不是不同的實例,那么不會拋出異常,代碼如下:

        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;          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,            Email = "test@132.com",          };          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.

C#,Entity,Framework,常見報錯

賦給主鍵一個不存在的值,令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<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,常見報錯

 

注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美腿一区在线看| 91国自产精品中文字幕亚洲| 国内偷自视频区视频综合| 日本精品久久久久久久| 欧美另类暴力丝袜| 日本人成精品视频在线| 日韩在线观看av| 97精品伊人久久久大香线蕉| 成人福利网站在线观看| 91精品久久久久久久| 日本精品在线视频| 一本色道久久综合狠狠躁篇的优点| 亚洲自拍欧美另类| 欧美视频在线观看免费| 精品久久久久久中文字幕大豆网| 成人97在线观看视频| 亚洲性夜色噜噜噜7777| 日韩大片在线观看视频| 97在线视频免费观看| 欧美激情亚洲精品| 欧美性猛交xxxx乱大交3| 亚洲欧美日韩国产中文| 77777少妇光屁股久久一区| 伊人激情综合网| 国产九九精品视频| 国产日本欧美在线观看| 国产精品av电影| 高跟丝袜欧美一区| 欧美日韩一区二区免费视频| 欧美激情视频在线| 欧美日韩裸体免费视频| 中文字幕九色91在线| 亚洲美女福利视频网站| 狠狠躁夜夜躁人人爽天天天天97| 成人高h视频在线| 国产成人精品国内自产拍免费看| 久久精品国产2020观看福利| 欧美一级视频在线观看| 亚洲国产日韩欧美在线动漫| 亚洲国产成人久久综合一区| 国产免费一区二区三区在线能观看| 日韩最新av在线| 亚洲精品美女在线观看播放| 国产精品第七十二页| 国产综合在线看| 少妇精69xxtheporn| 欧美成人精品在线观看| 中文字幕av一区中文字幕天堂| 亚洲精品第一页| 日韩av理论片| 日韩美女在线播放| 国产一区红桃视频| 日韩av网址在线观看| 精品久久国产精品| 欧美天堂在线观看| www.欧美视频| 亚洲国产精品yw在线观看| 伊人男人综合视频网| 欧美国产一区二区三区| 国产精品你懂得| 中文字幕自拍vr一区二区三区| 精品亚洲一区二区三区在线播放| 日韩av免费在线看| 中文日韩电影网站| 国产精品最新在线观看| 欧美性猛交99久久久久99按摩| 777国产偷窥盗摄精品视频| 成人一区二区电影| 青青久久av北条麻妃黑人| 亚洲免费电影在线观看| 国内精品模特av私拍在线观看| 北条麻妃一区二区三区中文字幕| 国产亚洲在线播放| 久久99亚洲热视| 久久久国产视频91| 91av在线看| 欧美不卡视频一区发布| 久久99精品久久久久久琪琪| 国产精品久久99久久| 国产精品日韩在线播放| 亚洲九九九在线观看| 亚洲成人av在线播放| 91精品一区二区| 青青在线视频一区二区三区| 久久久久久久色| 92裸体在线视频网站| 亚洲男人7777| 精品性高朝久久久久久久| 国产精品自拍视频| 国产亚洲精品久久| 美女久久久久久久久久久| 国产精品亚洲片夜色在线| 亚洲新中文字幕| 国产精品高潮呻吟久久av无限| 日本国产精品视频| 精品国产91久久久久久| 国产欧美日韩精品在线观看| 久久精品亚洲国产| 精品视频久久久久久久| 国产亚洲免费的视频看| 亚洲第一精品福利| 欧美日韩免费区域视频在线观看| 91精品国产一区| 97视频在线看| 日韩在线播放一区| 日韩一中文字幕| 懂色av一区二区三区| 国产美女久久精品香蕉69| 日韩资源在线观看| 欧美视频在线免费看| 日韩av免费看网站| 亚洲天堂一区二区三区| 亚洲乱码av中文一区二区| 日本久久中文字幕| 亚洲已满18点击进入在线看片| 国产亚洲精品久久久久久| 国产精品va在线播放我和闺蜜| 欧美日韩国产精品一区二区不卡中文| 亚洲码在线观看| 日韩免费电影在线观看| 一个色综合导航| 国产精品网红福利| 久久成人亚洲精品| 国产精品视频不卡| 亚洲国产精品久久| 国产精品91久久久| 日韩中文字幕在线播放| 中文字幕国产精品| 美女黄色丝袜一区| 欧美放荡办公室videos4k| 国产精品亚发布| 亚洲欧美日韩第一区| 亚洲精品美女在线| 欧洲日韩成人av| 久久偷看各类女兵18女厕嘘嘘| 国产精品福利无圣光在线一区| 日韩成人黄色av| 欧美自拍视频在线观看| 精品久久久久久国产| 国产精品91久久久久久| 久久免费高清视频| 色妞在线综合亚洲欧美| 亚洲毛片在线看| 精品国偷自产在线视频99| 亚洲成人1234| 久久国产精彩视频| 欧美午夜美女看片| 欧美理论电影网| 中文日韩在线视频| 91在线网站视频| 亚洲白拍色综合图区| 668精品在线视频| 国产美女搞久久| 欧美日韩国产成人| 超碰97人人做人人爱少妇| 中文字幕一精品亚洲无线一区| 久久精品亚洲热| 91亚洲永久免费精品| 国产精品一区二区三区在线播放| 精品一区二区三区四区在线| 91久久国产精品91久久性色| 久热精品视频在线观看| 日韩电影免费在线观看| 亚洲高清av在线|