一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#中Entity Framework常見報錯匯總

C#中Entity Framework常見報錯匯總

2022-02-13 15:13C#教程網 C#

給大家總結了C#中Entity Framework常見報錯,以及處理這些錯誤的方法,希望能夠為你提供到幫助。

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

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

拋出異常類型dbentityvalidationexception

表結構:

C#中Entity Framework常見報錯匯總

實體:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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; }
  }

實體配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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);
    }
}

更新操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
using (customdbcontext db = new customdbcontext())
{
          user user = new user
          {
            id = 1,
            email = "[email protected]",
          };
          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包起來,如下寫法:

?
1
2
3
4
5
6
7
8
9
10
11
try
{
//執行代碼
}
catch (dbentityvalidationexception ex)
{
  var e = ex.entityvalidationerrors;
}
catch (exception ex)
{
}

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

C#中Entity Framework常見報錯匯總

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

更新操作代碼變為

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (customdbcontext db = new customdbcontext())
{
  user user = new user
  {
    id = 1,
    email = "[email protected]",
    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

實體屬性配置如上例所示。

操作代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using (customdbcontext db = new customdbcontext())
{
  user user = new user
  {
    id = 1,
    email = "[email protected]",
  };
  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 = "[email protected]",
  };
  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有相同的值。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using (customdbcontext db = new customdbcontext())
{
  user user = new user
  {
    id = 1,
    email = "[email protected]",
  };
  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是主鍵:

?
1
2
3
4
5
6
7
8
9
10
11
12
using (customdbcontext db = new customdbcontext())
  {
    user user = new user
    {
      //id = 1,
      email = "[email protected]",
    };
    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。

操作代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
using (customdbcontext db = new customdbcontext())
        {
          user user = new user
          {
            id = 4,
            email = "[email protected]",
            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常見報錯匯總

 

原文鏈接:https://www.cnblogs.com/hdwgxz/p/7897031.html

延伸 · 閱讀

精彩推薦
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
主站蜘蛛池模板: 日本漫画无翼乌 | 丝袜兔女郎被啪在线观看91 | 亚洲AV永久无码精品老司机蜜桃 | 日韩久久中文字幕 | 果冻传媒ⅹxxxxxhd | 91精品国产色综合久久不卡蜜 | 国产人va在线 | 我的家教老师 | 秀逼逼| 女子监狱第二季在线观看免费完整版 | 久久人妻少妇嫩草AV無碼 | 91麻豆精东果冻天美传媒老狼 | 日韩一本在线 | 日韩精品一区二区三区老鸭窝 | 丝瓜秋葵番茄绿巨人在线观看 | 四缺一的小说 | www视频免费观看 | 情趣内衣在线观看 | 免费看打屁股视频的软件 | 草草影院免费 | 免费视频一区 | 91精品国产美女福到在线不卡 | 免费一级国产大片 | 欧美人在线一区二区三区 | 小伙无套内射老女人 | 午夜十八岁禁 | 亚洲精品第二页 | 亚洲春色综合另类网蜜桃 | 国产亚洲精品一区在线播 | 国产福利兔女郎在线观看 | 国产亚洲精品精品国产亚洲综合 | 国产露脸对白刺激3p在线 | 无限资源在线观看完整版免费下载 | 男人j放进女人的p视频免费 | 白发在线视频播放观看免费 | 我不卡影院手机在线观看 | 亚洲精品色综合久久 | 欧美猛男同志video在线 | 欧美精品一区二区三区免费播放 | chinesespanking网站 | 国产男女乱淫真视频全程播放 |