ฉันจะแก้ไขข้อยกเว้น“ ไม่พบแถวหรือเปลี่ยนแปลง” ใน LINQ เป็น SQL บนฐานข้อมูล SQL Server Compact Edition ได้อย่างไร


96

เมื่อดำเนินการ SubmitChanges ไปยัง DataContext หลังจากอัปเดตคุณสมบัติสองสามอย่างด้วยการเชื่อมต่อ LINQ กับ SQL (เทียบกับ SQL Server Compact Edition) ฉันได้รับข้อความ "ไม่พบแถวหรือเปลี่ยนแปลง" ChangeConflictException

var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);

deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;

ctx.SubmitChanges();

แบบสอบถามสร้าง SQL ต่อไปนี้:

UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8

ปัญหาที่ชัดเจนคือWHERE 0 = 1หลังจากโหลดบันทึกแล้วฉันได้ยืนยันว่าคุณสมบัติทั้งหมดใน "deviceSessionRecord" ถูกต้องในการรวมคีย์หลัก นอกจากนี้เมื่อจับ "ChangeConflictException" จะไม่มีข้อมูลเพิ่มเติมว่าเหตุใดจึงล้มเหลว ฉันยังยืนยันว่าข้อยกเว้นนี้เกิดขึ้นพร้อมกับระเบียนเดียวในฐานข้อมูล (บันทึกที่ฉันพยายามอัปเดต)

สิ่งที่แปลกคือฉันมีคำสั่งการอัปเดตที่คล้ายกันมากในส่วนอื่นของโค้ดและสร้าง SQL ต่อไปนี้และทำการอัปเดตฐานข้อมูล SQL Server Compact Edition ของฉัน

UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8

ฉันยืนยันว่ามีการระบุค่าฟิลด์หลักที่เหมาะสมทั้งในสคีมาฐานข้อมูลและ DBML ที่สร้างคลาส LINQ

ฉันเดาว่านี่เป็นคำถามสองส่วน:

  1. เหตุใดจึงมีการโยนข้อยกเว้น
  2. หลังจากตรวจสอบชุดที่สองของ SQL ที่สร้างขึ้นดูเหมือนว่าสำหรับการตรวจจับความขัดแย้งจะเป็นการดีที่จะตรวจสอบฟิลด์ทั้งหมด แต่ฉันคิดว่านี่จะไม่มีประสิทธิภาพพอสมควร วิธีนี้ใช้ได้ผลเสมอหรือไม่? มีการตั้งค่าเพียงตรวจสอบคีย์หลักหรือไม่

ฉันต่อสู้กับเรื่องนี้มาสองชั่วโมงแล้วดังนั้นความช่วยเหลือใด ๆ จะได้รับการชื่นชม


FWIW: ฉันได้รับข้อผิดพลาดนี้เมื่อเรียกใช้เมธอดสองครั้งโดยไม่ได้ตั้งใจ มันจะเกิดขึ้นในการโทรครั้งที่สอง
Kris

ดูข้อมูลเบื้องหลังที่ยอดเยี่ยมได้ที่c-sharpcorner.com/article/…
CAK2

คำตอบ:


191

นั่นน่ารังเกียจ แต่เรียบง่าย:

ตรวจสอบว่าชนิดข้อมูลสำหรับเขตข้อมูลทั้งหมดใน O / R-Designer ตรงกับชนิดข้อมูลในตาราง SQL ของคุณหรือไม่ ตรวจสอบอีกครั้งว่าเป็นโมฆะ! คอลัมน์ควรเป็นโมฆะทั้งใน O / R-Designer และ SQL หรือไม่สามารถว่างได้ทั้งสองอย่าง

ตัวอย่างเช่นคอลัมน์ NVARCHAR "title" ถูกทำเครื่องหมายเป็น NULLable ในฐานข้อมูลของคุณและมีค่า NULL แม้ว่าคอลัมน์จะถูกทำเครื่องหมายว่าไม่เป็นโมฆะใน O / R-Mapping ของคุณ LINQ จะโหลดสำเร็จและตั้งค่า column-String เป็น null

  • ตอนนี้คุณเปลี่ยนบางอย่างแล้วโทร SubmitChanges ()
  • LINQ จะสร้างแบบสอบถาม SQL ที่มี "WHERE [title] IS NULL" เพื่อให้แน่ใจว่าไม่มีผู้อื่นเปลี่ยนชื่อ
  • LINQ ค้นหาคุณสมบัติของ [title] ในการแมป
  • LINQ จะพบ [ชื่อ] NOT NULLable
  • เนื่องจาก [title] ไม่เป็นโมฆะโดยตรรกะแล้วมันจะไม่เป็นโมฆะ!
  • ดังนั้นการเพิ่มประสิทธิภาพการสืบค้น LINQ จะแทนที่ด้วย "โดยที่ 0 = 1" ซึ่งเทียบเท่ากับ SQL ของ "never"

อาการเดียวกันนี้จะปรากฏขึ้นเมื่อชนิดข้อมูลของเขตข้อมูลไม่ตรงกับประเภทข้อมูลใน SQL หรือหากเขตข้อมูลหายไปเนื่องจาก LINQ จะไม่สามารถตรวจสอบให้แน่ใจว่าข้อมูล SQL ไม่ได้เปลี่ยนแปลงไปตั้งแต่อ่านข้อมูล


4
ฉันมีปัญหาที่คล้ายกันแม้ว่าจะแตกต่างกันเล็กน้อย - และคำแนะนำของคุณในการตรวจสอบอีกครั้งเพื่อหาโมฆะช่วยให้วันของฉันรอด! ฉันหัวล้านแล้ว แต่ปัญหานี้จะทำให้ฉันต้องเสียเงินอีกรอบถ้าฉันมี .. ขอบคุณ!
Rune Jacobsen

7
ตรวจสอบให้แน่ใจว่าคุณตั้งค่าคุณสมบัติ 'Nullable' ในหน้าต่างคุณสมบัติเป็น True ฉันกำลังแก้ไขคุณสมบัติ 'Server Data Type' โดยเปลี่ยนจากVARCHAR(MAX) NOT NULLเป็นVARCHAR(MAX) NULLและคาดว่าจะใช้งานได้ ข้อผิดพลาดง่ายมาก

ต้องโหวตให้คะแนนนี้ ช่วยให้ฉันประหยัดเวลาได้มาก กำลังดูระดับการแยกตัวของฉันเพราะฉันคิดว่ามันเป็นปัญหาที่เกิดขึ้นพร้อมกัน
เอเดรียน

3
ฉันมีNUMERIC(12,8)คอลัมน์ที่แมปกับDecimalคุณสมบัติ ฉันต้องแม่นยำ DbType ในแอตทริบิวต์คอลัมน์ [Column(DbType="numeric(12,8)")] public decimal? MyProperty ...
Costo

3
วิธีหนึ่งในการระบุฟิลด์ / คอลัมน์ของปัญหาคือการบันทึกคลาสเอนทิตี Linq-to-SQL ปัจจุบันของคุณซึ่งอยู่ในไฟล์. dbml ไปยังไฟล์แยกต่างหาก จากนั้นลบโมเดลปัจจุบันของคุณและสร้างใหม่จากฐานข้อมูล (โดยใช้ VS) ซึ่งจะสร้างไฟล์. dbml ใหม่ จากนั้นเพียงเรียกใช้ตัวเปรียบเทียบเช่น WinMerge หรือ WinDiff บนไฟล์. dbml สองไฟล์เพื่อค้นหาความแตกต่างของปัญหา
david.barkhuizen

26

ประการแรกควรทราบว่าอะไรเป็นสาเหตุของปัญหา โซลูชัน Google น่าจะช่วยได้คุณสามารถบันทึกรายละเอียด (ตารางคอลัมน์ค่าเก่าค่าใหม่) เกี่ยวกับความขัดแย้งเพื่อหาทางออกที่ดีกว่าในการแก้ไขความขัดแย้งในภายหลัง:

public class ChangeConflictExceptionWithDetails : ChangeConflictException
{
    public ChangeConflictExceptionWithDetails(ChangeConflictException inner, DataContext context)
        : base(inner.Message + " " + GetChangeConflictExceptionDetailString(context))
    {
    }

    /// <summary>
    /// Code from following link
    /// https://ittecture.wordpress.com/2008/10/17/tip-of-the-day-3/
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    static string GetChangeConflictExceptionDetailString(DataContext context)
    {
        StringBuilder sb = new StringBuilder();

        foreach (ObjectChangeConflict changeConflict in context.ChangeConflicts)
        {
            System.Data.Linq.Mapping.MetaTable metatable = context.Mapping.GetTable(changeConflict.Object.GetType());

            sb.AppendFormat("Table name: {0}", metatable.TableName);
            sb.AppendLine();

            foreach (MemberChangeConflict col in changeConflict.MemberConflicts)
            {
                sb.AppendFormat("Column name : {0}", col.Member.Name);
                sb.AppendLine();
                sb.AppendFormat("Original value : {0}", col.OriginalValue.ToString());
                sb.AppendLine();
                sb.AppendFormat("Current value : {0}", col.CurrentValue.ToString());
                sb.AppendLine();
                sb.AppendFormat("Database value : {0}", col.DatabaseValue.ToString());
                sb.AppendLine();
                sb.AppendLine();
            }
        }

        return sb.ToString();
    }
}

สร้างตัวช่วยในการตัด sumbitChanges ของคุณ:

public static class DataContextExtensions
{
    public static void SubmitChangesWithDetailException(this DataContext dataContext)
    {   
        try
        {         
            dataContext.SubmitChanges();
        }
        catch (ChangeConflictException ex)
        {
            throw new ChangeConflictExceptionWithDetails(ex, dataContext);
        }           
    }
}

จากนั้นโทรส่งรหัสการเปลี่ยนแปลง:

Datamodel.SubmitChangesWithDetailException();

สุดท้ายบันทึกข้อยกเว้นในตัวจัดการข้อยกเว้นส่วนกลางของคุณ:

protected void Application_Error(object sender, EventArgs e)
{         
    Exception ex = Server.GetLastError();
    //TODO
}

3
ทางออกที่ยอดเยี่ยม! ฉันมีตารางที่มีประมาณ 80 ฟิลด์และมีทริกเกอร์จำนวนมากบนตารางที่กำลังอัปเดตฟิลด์ต่างๆในระหว่างการแทรกและการอัปเดต ฉันได้รับข้อผิดพลาดนี้จากเมื่ออัปเดตบริบทข้อมูลโดยใช้ L2S แต่ค่อนข้างแน่ใจว่าเกิดจากหนึ่งในทริกเกอร์ที่อัปเดตฟิลด์จึงทำให้บริบทข้อมูลแตกต่างจากข้อมูลในตาราง รหัสของคุณช่วยให้ฉันทราบว่าช่องใดที่ทำให้บริบทข้อมูลไม่ตรงกับตาราง ขอบคุณมาก !!
Jagd

1
นี่เป็นทางออกที่ยอดเยี่ยมสำหรับโต๊ะขนาดใหญ่ ในการจัดการ null ให้เปลี่ยน 'col.XValue ToString ()' เป็น 'col.XValue == null? "null": col.XValue ToString () 'สำหรับแต่ละฟิลด์ค่าสามฟิลด์
humbads

เพื่อป้องกันการอ้างอิง null เมื่อสตริง OriginalValue, CurrentValue และ DatabaseValue
Floyd Kosch

16

มีวิธีการบน DataContext เรียกว่าRefreshซึ่งอาจช่วยได้ที่นี่ ช่วยให้คุณสามารถโหลดบันทึกฐานข้อมูลซ้ำก่อนที่จะส่งการเปลี่ยนแปลงและเสนอโหมดต่างๆเพื่อกำหนดค่าที่จะเก็บไว้ "KeepChanges" ดูเหมือนจะฉลาดที่สุดสำหรับจุดประสงค์ของฉันโดยมีจุดประสงค์เพื่อรวมการเปลี่ยนแปลงของฉันกับการเปลี่ยนแปลงที่ไม่ขัดแย้งใด ๆ ที่เกิดขึ้นในฐานข้อมูลในระหว่างนี้

ถ้าเข้าใจถูกต้อง. :)


6
คำตอบนี้แก้ไขปัญหาในกรณีของฉัน: dc.Refresh(RefreshMode.KeepChanges,changedObject);ก่อน dc.SubmitChanges
HugoRune

ฉันมีปัญหานี้เมื่อใช้ ReadOnlyAttribute กับคุณสมบัติในเว็บไซต์ Dynamic Data การอัปเดตหยุดทำงานและฉันได้รับข้อผิดพลาด "ไม่พบแถวหรือเปลี่ยนแปลง" (ส่วนแทรกก็ใช้ได้) การแก้ไขข้างต้นช่วยประหยัดความพยายามและเวลาได้มาก!
Chris Cannon

คุณช่วยอธิบายค่า RefreshMode ได้ไหมเช่น KeepCurrentValues ​​หมายถึงอะไร มันทำอะไร? ขอบคุณมาก. ฉันสามารถสร้างคำถาม ...
Chris Cannon

ฉันมีปัญหากับการทำธุรกรรมพร้อมกันไม่เสร็จสิ้นในเวลาที่ธุรกรรมอื่นจะเริ่มต้นในแถวเดียวกัน KeepChanges ช่วยฉันที่นี่ดังนั้นบางทีมันอาจจะยกเลิกธุรกรรมปัจจุบัน (ในขณะที่รักษาค่าที่บันทึกไว้) และเริ่มต้นใหม่ (โดยสุจริตฉันไม่รู้)
Erik Bergstedt

11

นอกจากนี้ยังสามารถเกิดจากการใช้ DbContext มากกว่าหนึ่งรายการ

ตัวอย่างเช่น:

protected async Task loginUser(string username)
{
    using(var db = new Db())
    {
        var user = await db.Users
            .SingleAsync(u => u.Username == username);
        user.LastLogin = DateTime.UtcNow;
        await db.SaveChangesAsync();
    }
}

protected async Task doSomething(object obj)
{
    string username = "joe";
    using(var db = new Db())
    {
        var user = await db.Users
            .SingleAsync(u => u.Username == username);

        if (DateTime.UtcNow - user.LastLogin >
            new TimeSpan(0, 30, 0)
        )
            loginUser(username);

        user.Something = obj;
        await db.SaveChangesAsync();
    }
}

รหัสนี้จะล้มเหลวเป็นครั้งคราวในรูปแบบที่ไม่สามารถคาดเดาได้เนื่องจากผู้ใช้ถูกใช้ในบริบททั้งสองเปลี่ยนแปลงและบันทึกไว้ในที่เดียวจากนั้นบันทึกในอีกบริบทหนึ่ง การแสดงในหน่วยความจำของผู้ใช้ที่เป็นเจ้าของ "บางสิ่ง" ไม่ตรงกับสิ่งที่อยู่ในฐานข้อมูลดังนั้นคุณจึงได้รับข้อบกพร่องที่ซ่อนอยู่นี้

วิธีหนึ่งในการป้องกันปัญหานี้คือการเขียนโค้ดใด ๆ ที่อาจถูกเรียกว่าเป็นไลบรารีเมธอดในลักษณะที่ใช้ DbContext ทางเลือก:

protected async Task loginUser(string username, Db _db = null)
{
    await EFHelper.Using(_db, async db =>
    {
        var user = await db.Users...
        ... // Rest of loginUser code goes here
    });
}

public class EFHelper
{
    public static async Task Using<T>(T db, Func<T, Task> action)
        where T : DbContext, new()
    {
        if (db == null)
        {
            using (db = new T())
            {
                await action(db);
            }
        }
        else
        {
            await action(db);
        }
    }
}

ตอนนี้วิธีการของคุณใช้ฐานข้อมูลที่เป็นทางเลือกและถ้าไม่มีก็ไปและสร้างขึ้นมาเอง หากมีเพียงแค่นำสิ่งที่ส่งผ่านมากลับมาใช้ใหม่วิธีการช่วยเหลือทำให้ง่ายต่อการนำรูปแบบนี้กลับมาใช้ในแอป


10

ฉันแก้ไขข้อผิดพลาดนี้โดยการลากเส้นบนตารางจากตัวสำรวจเซิร์ฟเวอร์ไปยังผู้ออกแบบและสร้างใหม่


การรื้อถอนตารางที่กระทำผิดจาก Server Explorer ไปยังผู้ออกแบบและการสร้างใหม่ก็แก้ไขสิ่งนี้ให้ฉันเช่นกัน
rstackhouse

4

นี่คือสิ่งที่คุณต้องการเพื่อแทนที่ข้อผิดพลาดนี้ในรหัส C #:

            try
            {
                _db.SubmitChanges(ConflictMode.ContinueOnConflict);
            }
            catch (ChangeConflictException e)
            {
                foreach (ObjectChangeConflict occ in _db.ChangeConflicts)
                {
                    occ.Resolve(RefreshMode.KeepChanges);
                }
            }

ฉันได้จัดกำหนดการรายการที่ส่งโดยส่วนหน้าของแอปพลิเคชันไปยังฐานข้อมูล การเรียกใช้ทริกเกอร์เหล่านี้ในบริการแต่ละชุดจะอยู่ในเธรดที่แตกต่างกัน ผู้ใช้สามารถกดปุ่ม 'ยกเลิก' ซึ่งจะเปลี่ยนสถานะของคำสั่งที่ค้างอยู่ทั้งหมด บริการเสร็จสิ้นแต่ละรายการ แต่พบว่า 'รอดำเนินการ' ถูกเปลี่ยนเป็น 'ยกเลิก' และไม่สามารถเปลี่ยนเป็น 'เสร็จสมบูรณ์' ได้ สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้
pwrgreg007

2
ตรวจสอบการแจงนับอื่น ๆ ของ RefreshMode เช่น KeepCurrentValues โปรดทราบว่าคุณต้องเรียก SubmitChanges อีกครั้งหลังจากใช้ตรรกะนี้ ดูmsdn.microsoft.com/en-us/library/...
pwrgreg007

3

ฉันไม่รู้ว่าคุณพบคำตอบที่น่าพอใจสำหรับคำถามของคุณหรือไม่ แต่ฉันโพสต์คำถามที่คล้ายกันนี้และในที่สุดก็ตอบด้วยตัวเอง ปรากฎว่าตัวเลือกการเชื่อมต่อเริ่มต้น NOCOUNT ถูกเปิดใช้งานสำหรับฐานข้อมูลซึ่งทำให้เกิด ChangeConflictException สำหรับทุกการอัปเดตที่ทำด้วย Linq เป็น Sql คุณสามารถดูการโพสต์ของฉันที่นี่


3

ฉันแก้ไขสิ่งนี้โดยเพิ่มคำจำกัดความ(UpdateCheck = UpdateCheck.Never)ทั้งหมด[Column]

ไม่รู้สึกว่าเป็นทางออกที่เหมาะสมแม้ว่า ในกรณีของฉันดูเหมือนว่าจะเกี่ยวข้องกับข้อเท็จจริงที่ว่าตารางนี้มีการเชื่อมโยงกับตารางอื่นจากการที่แถวถูกลบ

นี่คือบน Windows Phone 7.5


1

ในกรณีของฉันข้อผิดพลาดเกิดขึ้นเมื่อผู้ใช้สองคนที่มีบริบทข้อมูล LINQ-to-SQL ที่แตกต่างกันอัปเดตเอนทิตีเดียวกันในลักษณะเดียวกัน เมื่อผู้ใช้คนที่สองพยายามอัปเดตสำเนาที่มีในบริบทข้อมูลของพวกเขาจะไม่อัปเดตแม้ว่าจะถูกอ่านหลังจากการอัปเดตครั้งแรกเสร็จสิ้น

ฉันค้นพบคำอธิบายและวิธีแก้ปัญหาในบทความนี้โดย Akshay Phadke: https://www.c-sharpcorner.com/article/overview-of-concurrency-in-linq-to-sql/

นี่คือรหัสที่ฉันยกขึ้นเป็นส่วนใหญ่:

try
{
    this.DC.SubmitChanges();
}
catch (ChangeConflictException)
{
     this.DC.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);

     foreach (ObjectChangeConflict objectChangeConflict in this.DC.ChangeConflicts)
     {
         foreach (MemberChangeConflict memberChangeConflict in objectChangeConflict.MemberConflicts)
         {
             Debug.WriteLine("Property Name = " + memberChangeConflict.Member.Name);
             Debug.WriteLine("Current Value = " + memberChangeConflict.CurrentValue.ToString());
             Debug.WriteLine("Original Value = " + memberChangeConflict.OriginalValue.ToString());
             Debug.WriteLine("Database Value = " + memberChangeConflict.DatabaseValue.ToString());
         }
     }
     this.DC.SubmitChanges();
     this.DC.Refresh(RefreshMode.OverwriteCurrentValues, att);
 }

เมื่อฉันดูที่หน้าต่างผลลัพธ์ของฉันในขณะที่ดีบักฉันจะเห็นว่าค่าปัจจุบันตรงกับค่าฐานข้อมูล "มูลค่าดั้งเดิม" เป็นตัวการเสมอ นั่นคือค่าที่อ่านโดยบริบทข้อมูลก่อนใช้การอัปเดต

ขอบคุณ MarceloBarbosa สำหรับแรงบันดาลใจ


0

ฉันรู้ว่าคำถามนี้ได้รับคำตอบมานานแล้ว แต่ที่นี่ฉันใช้เวลาสองสามชั่วโมงที่ผ่านมาในการเอาหัวโขกกำแพงและฉันแค่อยากแบ่งปันวิธีแก้ปัญหาของฉันซึ่งปรากฎว่าไม่เกี่ยวข้องกับรายการใด ๆ ในชุดข้อความนี้:

เก็บเอาไว้!

ส่วน select () ของวัตถุข้อมูลของฉันใช้การแคช เมื่อพูดถึงการอัปเดตวัตถุข้อผิดพลาด Row Not Found หรือ Changed กำลังครอบตัดขึ้น

คำตอบหลายคำได้กล่าวถึงการใช้ DataContext ที่แตกต่างกันและหากมองย้อนกลับไปนี่อาจเป็นสิ่งที่เกิดขึ้น แต่มันไม่ได้ทำให้ฉันนึกถึงการแคชในทันทีดังนั้นหวังว่านี่จะช่วยใครสักคนได้!


0

ฉันเพิ่งพบข้อผิดพลาดนี้และพบว่าปัญหาไม่ได้อยู่ที่บริบทข้อมูลของฉัน แต่มีคำสั่งอัพเดตที่เริ่มทำงานภายในทริกเกอร์หลังจากที่มีการเรียก Commit ในบริบท ทริกเกอร์พยายามอัปเดตฟิลด์ที่ไม่เป็นค่าว่างด้วยค่า null และทำให้บริบทผิดพลาดกับข้อความที่กล่าวถึงข้างต้น

ฉันกำลังเพิ่มคำตอบนี้เพียงเพื่อช่วยให้ผู้อื่นจัดการกับข้อผิดพลาดนี้และไม่พบวิธีแก้ไขในคำตอบด้านบน


0

ฉันยังได้รับข้อผิดพลาดนี้เนื่องจากใช้สองบริบทที่แตกต่างกัน ฉันแก้ไขปัญหานี้โดยใช้บริบทข้อมูลเดียว


0

ในกรณีของฉันปัญหาเกิดจากตัวเลือกผู้ใช้ทั้งเซิร์ฟเวอร์ กำลังติดตาม:

https://msdn.microsoft.com/en-us/library/ms190763.aspx

ฉันเปิดใช้งานตัวเลือก NOCOUNT โดยหวังว่าจะได้รับประโยชน์ด้านประสิทธิภาพ:

EXEC sys.sp_configure 'user options', 512;
RECONFIGURE;

และสิ่งนี้กลายเป็นการทำลายการตรวจสอบของ Linq สำหรับแถวที่ได้รับผลกระทบ (เท่าที่ฉันสามารถหาได้จากแหล่งที่มา. NET) ซึ่งนำไปสู่ChangeConflictException

การรีเซ็ตตัวเลือกเพื่อแยก 512 บิตช่วยแก้ปัญหาได้


0

หลังจากใช้คำตอบของ qub1n ฉันพบว่าปัญหาสำหรับฉันคือฉันได้ประกาศคอลัมน์ฐานข้อมูลเป็นทศนิยมโดยไม่ได้ตั้งใจ (18,0) ฉันกำลังกำหนดค่าทศนิยม แต่ฐานข้อมูลกำลังเปลี่ยนแปลงโดยลอกส่วนทศนิยมออก ส่งผลให้แถวเปลี่ยนปัญหา

เพียงเพิ่มสิ่งนี้หากใครพบปัญหาที่คล้ายกัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.