Неожиданное изменение ForeignKey на SaveChanges - PullRequest
0 голосов
/ 11 июня 2019

в настоящее время я пытаюсь разгадать загадку EntityFramework , магически изменяющую мою собственность во время SaveChanges

, поэтому по какой-то причине следующий отсканированный код решает изменить значение ReceiptEntryвсегда 10 или 12

void HandleReceipt(DBContext cntxt, Receipt receipt, ...)
{
    [...]
    var receiptEntries = receipt.GetEntries(cntxt);
    var receiptEntriesItem = from q in cntxt.Items
                             where ...
                             select new { ... };
    var receiptEntriesItemDictionary = receiptEntriesItem.ToDictionary(...);
    [...]
    while (...)
    {
        [...]
        var receiptEntry = receiptEntriesItemDictionary[it.ItemFK];
        [...]
        foreach (var kvp in ...)
        {
            var sle = usedStorages.First((sl) => sl.Id == kvp.Key);
            entry = new PickListEntry
            {
                Parent = receipt.PickList,
                Amount = kvp.Value,
                ReceiptEntry = receiptEntry, // receiptEntry is the instance with eg. Id 60
                StorageLocation = sle
            };
            sle.Stock = new Stock { AmountAvailable = 0, ItemFK = receiptEntry.ItemFK };
            var createdEntry = cntxt.PickListEntries.Add(entry);
            cntxt.SaveChanges(); // ReceiptEntry property gets modified in here to the instance with 10 or 12
            [...]
        }
        [...]
    }
}

, сейчас я не знаю, почему это может произойти.

10 и 12 - это записи, которые не относятся к текущим работам на receiptкаким-либо образом (однако они загружаются в текущий cntxt и обрабатываются в другом вызове HandleReceipt)

Я уже трижды проверил, что эти два никогда не назначаются нигде (запись только когда-либо используется прямо тами никогда после этого здесь) и проверил, когда они меняются (Знаменитый [External Code] точно на один шаг ниже установщика)

Кто-нибудь способен сказать мне, почему это происходит и как это исправить?Раскрутить еще один DBContext не вариант, так как это происходит внутри транзакции (cntxt.Database.BeginTransaction()) (иначе: что-то не получается означает, что все нужно откатить)

1 Ответ

0 голосов
/ 11 июня 2019

Фактическая проблема заключалась в маленьком методе с именем FlatCopy(), который кто-то реализовал небрежно ...

// Problematic, as there is a collection in here that gets refered to
public ReceiptEntry FlatCopy() => this.MemberwiseClone() as ReceiptEntry;

// Totally fine as we create a new collection
public ReceiptEntry FlatCopy()
{
    var copy = this.MemberwiseClone() as ReceiptEntry;
    copy.PicklistEntries = new ObservableCollection<PickListEntry>();
    copy.Id = 0;
    return copy;
}

Фактическое обоснование вышеупомянутого "странного" поведения заключалось в том, что это было добавлено к другомуReceiptEntry 'PicklistEntries коллекция, которая затем привела к обновлению поля PickListEntry.ReceiptEntryFK.

TL; DR: Уважаемый пользователь, проверяйте ваши методы копирования, не являются ли они фактическисоздайте отдельные экземпляры своих коллекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...