国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鸡泽县| 灵川县| 天水市| 乐昌市| 富阳市| 永春县| 乡城县| 宾阳县| 长寿区| 黎城县| 青冈县| 津南区| 武冈市| 绍兴县| 安陆市| 楚雄市| 惠水县| 凉山| 平谷区| 宝兴县| 体育| 囊谦县| 扶绥县| 贞丰县| 嘉黎县| 天长市| 青阳县| 汝州市| 溧水县| 乌苏市| 大新县| 保靖县| 陵川县| 桦川县| 松潘县| 从化市| 五常市| 岱山县| 阿鲁科尔沁旗| 申扎县| 郑州市|