W jednokierunkowym związek wiele-do-wielu między Registration
i Item
, gdzie Registration
, wyposażoną w ISet<Item> ItemsPurchased
i Item
ma odesłanie do rejestracji (nie jest to skuteczny sposób w celu zbadania wykres Object) przy patrzę na SQL generowany widzęPłynna NHibernate - Zbędne zmiana
INSERT INTO Registrations_Items (RegistrationId, ItemId) VALUES (@p0, @p1);@p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
UPDATE Items SET Price = @p0, Name = @p1, [...], ListIndex = @p5, EventId = @p6 WHERE ItemId = @p7
parametry przekazywane do aktualizacji są poprawne, ale nic o rzeczy uległ zmianie, więc aktualizacja nie jest potrzebna.
Mapowanie polega na automatyzacji za pomocą tego zastąpienia w miejsce dla Registration
i bez przesłonięć dla Item
. DB Schema wygląda całkowicie poprawnie. Usunąłem wszystkie konwencje i przetestowałem je ponownie, a zachowanie utrzymywało się, więc nie jest to żadna z moich konwencji mapowania, które to robią.
mapping.HasManyToMany(e => e.ItemsPurchased).AsSet().Cascade.All().Not.Inverse();
Dlaczego NHibernate podejmowania tego UPDATE
rozmowę i co mogę zrobić, żeby go powstrzymać? To naprawdę nie rani niczego, ale sugeruje, że zrobiłem coś złego, więc chciałbym dowiedzieć się, co.
Edit: Per komentarzu poniżej, stworzyłem badanej jednostki, która tworzy Event
(Item
musi należeć do Event
) dodaje dwa Items
do niego evicts pierwszą z sesji i opróżnia sesji, a następnie pobiera pierwszy z powrotem przez jego identyfikator.
Zauważyłem coś dziwnego w wierszu wyboru elementów poniżej (2. od dołu)
INSERT INTO Events (blah blah blah...)
select @@IDENTITY
INSERT INTO Items (Price, Name, StartDate, EndDate, ExternalID, ListIndex, EventId) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6);@p0 = 100.42 [Type: Decimal (0)], @p1 = 'Item 1' [Type: String (0)], @p2 = NULL [Type: DateTime (0)], @p3 = NULL [Type: DateTime (0)], @p4 = '123' [Type: String (0)], @p5 = 0 [Type: Int32 (0)], @p6 = 1 [Type: Int32 (0)]
select @@IDENTITY
SELECT blah blah blah FROM Events event0_ WHERE [email protected];@p0 = 1 [Type: Int32 (0)]
SELECT itemsforsa0_.EventId as EventId1_, itemsforsa0_.ItemId as ItemId1_, itemsforsa0_.ListIndex as ListIndex1_, itemsforsa0_.ItemId as ItemId3_0_, itemsforsa0_.Price as Price3_0_, itemsforsa0_.Name as Name3_0_, itemsforsa0_.StartDate as StartDate3_0_, itemsforsa0_.EndDate as EndDate3_0_, itemsforsa0_.ExternalID as ExternalID3_0_, itemsforsa0_.ListIndex as ListIndex3_0_, itemsforsa0_.EventId as EventId3_0_ FROM Items itemsforsa0_ WHERE [email protected];@p0 = 1 [Type: Int32 (0)]
UPDATE Items SET Price = @p0, Name = @p1, StartDate = @p2, EndDate = @p3, ExternalID = @p4, ListIndex = @p5, EventId = @p6 WHERE ItemId = @p7;@p0 = 100.42000 [Type: Decimal (0)], @p1 = 'Item 1' [Type: String (0)], @p2 = NULL [Type: DateTime (0)], @p3 = NULL [Type: DateTime (0)], @p4 = '123' [Type: String (0)], @p5 = 0 [Type: Int32 (0)], @p6 = 1 [Type: Int32 (0)], @p7 = 1 [Type: Int32 (0)]
Stół jest utworzony poprawnie:
create table Items (
ItemId INT IDENTITY NOT NULL,
Price NUMERIC(19,5) not null,
Name NVARCHAR(255) not null,
StartDate DATETIME null,
EndDate DATETIME null,
ExternalID NVARCHAR(255) not null,
ListIndex INT not null,
EventId INT not null,
primary key (ItemId)
)
W DateTimes są celowo pustych ponieważ przedmiot może nie trzeba być specyficzne dla daty (przykład czegoś, co byłoby "rejestracją wczesnego ptaka").
Aby potwierdzić problem z aktualizacją fantomową, pobierz ten sam element i sprawdź, czy w opróżnieniu/zatwierdzeniu została wydana aktualizacja. Wtedy możesz wykluczyć problem kaskadowania wielu do wielu. – dotjoe
Czy może to być związane z polem dziesiętnym? Google wyświetla wyniki dla Phantom Updates i dziesiętne, ale nie doszedłem do sedna tego, co wszyscy mówią. –