中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中Entity Framework常見報錯有哪些

發布時間:2021-07-12 11:44:14 來源:億速云 閱讀:333 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“C#中Entity Framework常見報錯有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C#中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#中Entity Framework常見報錯有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孟连| 运城市| 恩平市| 怀柔区| 黔南| 南雄市| 福建省| 土默特左旗| 景洪市| 罗定市| 长海县| 奇台县| 黄梅县| 岫岩| 大田县| 彭水| 那曲县| 青田县| 正安县| 鸡东县| 寿宁县| 莒南县| 工布江达县| 南昌县| 高青县| 即墨市| 绥中县| 河东区| 永川市| 临沂市| 吉林省| 灯塔市| 木兰县| 周至县| 淮安市| 德惠市| 鹰潭市| 富平县| 天长市| 芒康县| 土默特右旗|