首页 > 解决方案 > C# DbContext.Add 奇怪的行为

问题描述

我有以下这段代码:

class Email_DAO{
   static Database database = null;
   public static void uploadToDb(EmailTrovate e)
        {
            try
            {
                Console.WriteLine(e.email+"\n\n");
                if (database == null) database = new Database();
                database.Emails.Add(e);
                database.SaveChanges();
                Console.WriteLine("OK");
            }
            catch (Exception ex) { Console.WriteLine(ex.InnerException); }
        }
        public static void uploadListToDb(List<EmailTrovate> listEmail)
        {
            try
            {
                foreach(EmailTrovate email in listEmail)
                {
                    uploadToDb(email);
                }
            }
            catch (Exception) {}
        }
}

以及执行前的数据库快照:(PK由ID和电子邮件组成)

+----+---------------+
| ID |     email     |
+----+---------------+
| 01 | test@test.com |
+--------------------+

现在,如果我写的话,从代码的另一部分(例如 Main)

EmailTrovate x1 = new EmailTrovate();
EmailTrovate x2 = new EmailTrovate();
x1.ID = 01;
x1.email = test@test.com;
x2.ID = 02;
x2.email = anothermail@provider.com;
List<EmailTrovate> list = List<EmailTrovate>();
list.Add(x1);
list.Add(x2);
Email_Dao.uploadListToDb(list);

预期行为:

test@test.com
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_email_trovate'. Cannot insert duplicate key in object 'dbo.EmailTrovate'. The duplicate key value is (test@test.com, 1).

anothermail@provider.com;
OK

实际行为:

test@test.com
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_email_trovate'. Cannot insert duplicate key in object 'dbo.EmailTrovate'. The duplicate key value is (test@test.com, 1).

anothermail@provider.com;
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_email_trovate'. Cannot insert duplicate key in object 'dbo.EmailTrovate'. The duplicate key value is (test@test.com, 1).

基本上它不允许我插入第二个条目!并且当它们显然是两个不同的对象时,异常说“重复的键值是(test@test.com,1)”。在我什至打印了正确打印的邮件的方法中,为什么它会尝试再次添加第一个 ogject 呢?先感谢您。

标签: c#databaseentity-frameworkentity-framework-6

解决方案


推荐阅读