最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Entity Framework常見報錯匯總

 更新時間:2017年11月26日 16:56:31   投稿:laozhang  
給大家總結(jié)了C#中Entity Framework常見報錯,以及處理這些錯誤的方法,希望能夠?yàn)槟闾峁┑綆椭?/div>

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

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

拋出異常類型DbEntityValidationException

表結(jié)構(gòu):

實(shí)體:

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

實(shí)體配置:

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

執(zhí)行操作,報錯信息如下:

查看EntityValidationErrors,

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

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

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

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

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

更新操作代碼變?yōu)?/p>

 

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

經(jīng)過上述調(diào)整后,更新成功。

那么換一個思路,將Account屬性被設(shè)置為IsOptional()是不是也可以呢?

修改實(shí)體配置,將Account屬性設(shè)置按如下修改,并注掉上面的Account = "a"

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

                .IsOptional()

                .IsUnicode(false)

                .HasMaxLength(50);

執(zhí)行測試,更改成功。

 

得出結(jié)論:在實(shí)體配置時,指定了為必選的字段,那么更新操作時,構(gòu)造實(shí)例一定要對必選(IsRequired())字段賦值。

上述測試中還有一個值得考慮的細(xì)節(jié),構(gòu)造User實(shí)例的時候,只對Id,Email進(jìn)行了賦值,而沒有對其他屬性進(jìn)行賦值,那么為什么會成功呢?那么必定是未進(jìn)行任何設(shè)置的實(shí)體屬性默認(rèn)是IsOptional()。這跟表結(jié)構(gòu)中的字段類型設(shè)置為Not Null有無關(guān)聯(lián)呢,從測試結(jié)果看就本類應(yīng)用無必然聯(lián)系。

總結(jié):

a.實(shí)體配置中指定了實(shí)體屬性為IsRequired(),更新操作構(gòu)造類的實(shí)例時必對此屬性賦值。

b.不進(jìn)行配置的實(shí)體屬性默認(rèn)為IsOptional()

c.表結(jié)構(gòu)中字段是否為Not Null對上述規(guī)則無影響。

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

實(shí)體屬性配置如上例所示。

操作代碼:

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

執(zhí)行操作

涉及到兩次修改操作,兩次操作構(gòu)造了兩個實(shí)例,但是實(shí)例的屬性Id有相同的值。

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

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

運(yùn)行上述代碼,拋出異常信息如下,注意異常類型居然是System.Data.Entity.Infrastructure.DbUpdateConcurrencyException,看上去像是并發(fā)問題,但實(shí)際卻不是!

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.

賦給主鍵一個不存在的值,令I(lǐng)d=4(在數(shù)據(jù)庫表中不存在Id為4的一條記錄)拋出的異常與上面的相同。

4 字段超長拋出異常:System.Data.Entity.Validation.DbEntityValidationException

表中Nickname 字段定義為50個字符,現(xiàn)在賦值超過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();
        }

運(yùn)行程序報錯:

一層一層點(diǎn)開,查看具體原因:

相關(guān)文章

  • C# Guid.NewGuid獲得隨機(jī)數(shù)

    C# Guid.NewGuid獲得隨機(jī)數(shù)

    根據(jù)GUID獲得種子,然后獲得隨機(jī)數(shù),這個是完全隨機(jī)的
    2013-04-04
  • C#實(shí)現(xiàn)從多列的DataTable里取需要的幾列

    C#實(shí)現(xiàn)從多列的DataTable里取需要的幾列

    這篇文章主要介紹了C#實(shí)現(xiàn)從多列的DataTable里取需要的幾列,涉及C#針對DataTable操作的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • C#中Json的簡單處理方法

    C#中Json的簡單處理方法

    這篇文章主要介紹了C#中Json的簡單處理方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • 基于反射解決類復(fù)制的實(shí)現(xiàn)方法

    基于反射解決類復(fù)制的實(shí)現(xiàn)方法

    本篇文章對反射解決類復(fù)制的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • c#中查詢表達(dá)式GroupBy的使用方法

    c#中查詢表達(dá)式GroupBy的使用方法

    本篇文章介紹一下GroupBy的使用方法,包括實(shí)驗(yàn)基礎(chǔ)數(shù)據(jù)用例,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友跟隨小編一起看看吧
    2021-11-11
  • 詳解C# 不能用于文件名的字符

    詳解C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作為文件名,嘗試重命名一個文件,輸入/ 就可以看到windows 提示的不能作為文件名的字符,那么具體是包括哪些符號不能作為文件名呢?下面小編給大家介紹下
    2018-02-02
  • C#多線程Thread使用示例詳解

    C#多線程Thread使用示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#多線程Thread使用示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 解答“60k”大佬的19道C#面試題(上)

    解答“60k”大佬的19道C#面試題(上)

    這篇文章主要解答了“60k”大佬的19道C#面試題中的10道,文中的面試題比較小眾,作者給了不錯的答案,相信對你以后的面試有所幫助,感興趣就來了解下
    2020-06-06
  • C#實(shí)現(xiàn)注冊碼的方法

    C#實(shí)現(xiàn)注冊碼的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)注冊碼的方法,可實(shí)現(xiàn)C#生成軟件注冊碼的相關(guān)功能,涉及C#硬件操作及隨機(jī)數(shù)操作的相關(guān)技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2015-08-08
  • 詳解C# 利用反射根據(jù)類名創(chuàng)建類的實(shí)例對象

    詳解C# 利用反射根據(jù)類名創(chuàng)建類的實(shí)例對象

    這篇文章主要介紹了詳解C# 利用反射根據(jù)類名創(chuàng)建類的實(shí)例對象,“反射”其實(shí)就是利用程序集的元數(shù)據(jù)信息,感興趣的小伙伴們可以參考一下。
    2017-03-03

最新評論

竹溪县| 尚志市| 五寨县| 哈密市| 扶风县| 连城县| 沂源县| 汶上县| 漳州市| 隆尧县| 长武县| 伊宁县| 洞头县| 宜川县| 敦化市| 丰顺县| 玉门市| 长沙市| 冕宁县| 乌鲁木齐县| 镇坪县| 安泽县| 荣昌县| 灵山县| 安平县| 陵川县| 新闻| 焉耆| 隆回县| 甘泉县| 沙田区| 蓬安县| 太康县| 依兰县| 桑日县| 来凤县| 巴林右旗| 安岳县| 许昌市| 高淳县| 高台县|