Looks like a DbLinq bug.  Can you please file it with the test case?

Even better, can you fix it? :-)

 - Jon

On Thu, 2010-04-22 at 08:52 -0700, Anders wrote:
> On Apr 22, 12:56 pm, mabu <[email protected]> wrote:
> > Some Code may help:
> >[...]
> > In the database i following:
> > * p is inserted twice with correct reportid
> > * c is inserted three times with the first product-id
> > * c2 is inserted once but without a product id
> 
> Just noticed: How did p get inserted twice? Don't you have a primary
> (or unique) key on the column? And if you don't, do you have foreign
> keys?
> 
> I created a simplified test, that uses the northwind schema.
> using (var context = new ReadTest().CreateDB()) {
>   var c = new nwind.Category { CategoryName = "cat1" };
>   context.Categories.InsertOnSubmit(c);
>   var p = new nwind.Product { Category = c, ProductName = "prod1" };
>   context.Products.InsertOnSubmit(p);
>   context.SubmitChanges();
> }
> 
> This fails with a primary key violation on both Oracle and SQLite. In
> the below lines starting with " Call ", ".. " and "-- Context: " have
> been removed and non primary-/foreign-key or name columns have been
> removed for readability. Some things look odd to me:
> - The selects from OrderDetails and Categories. Putting a breakpoint
> in WriteLog(IDbCommand) shows that they come from the loop over
> members in UpdateReferencedObjects(object). Is it really necessary to
> go to the database (on insert)?
> - The same selects uses literal values rather than parameters in the
> where-clause.
> - The second insert into Products. When
> SubmitChangesImpl(ConflictMode) is called CurrentTransactionEntities
> holds two items. The first holds the Category and the second the
> Product. But while running InsertEntity(object, QueryContext) for the
> category, UpdateReferencedObjects(entity) will insert the product. So
> when the second EntityTrack is processed, the Product is inserted
> again.
> 
> ---- Oracle ----
> INSERT INTO "NORTHWIND"."Categories" ("CategoryID",
> "CategoryName", ...) VALUES
> (Categories_seq.NEXTVAL, :CategoryName, ...)
> -- :CategoryName: Input AnsiString (Size = 4; Prec = 0; Scale = 0)
> [cat1]
> 
> SELECT Categories_seq.CurrVal INTO :CategoryID FROM DUAL
> 
> INSERT INTO "NORTHWIND"."Products" ("CategoryID", ..., "ProductID",
> "ProductName", ...) VALUES (:CategoryID, ...,
> Products_seq.NEXTVAL, :ProductName, ...)
> -- :CategoryID: Input Decimal (Size = 0; Prec = 0; Scale = 0) [7]
> -- :ProductName: Input AnsiString (Size = 5; Prec = 0; Scale = 0)
> [prod1]
> 
> SELECT Products_seq.CurrVal INTO :ProductID FROM DUAL
> 
> SELECT "Discount", "OrderID", "ProductID", "Quantity", "UnitPrice"
> FROM "NORTHWIND"."OrderDetails" WHERE ("ProductID" = 10)
> 
> SELECT "CategoryID", "CategoryName", "Description", "Picture" FROM
> "NORTHWIND"."Categories" WHERE ("CategoryID" = 7)
> 
> INSERT INTO "NORTHWIND"."Products" ("CategoryID", ..., "ProductID",
> "ProductName", ...) VALUES
> (:CategoryID, ..., :ProductID, :ProductName, ...)
> -- :CategoryID: Input Decimal (Size = 0; Prec = 0; Scale = 0) [7]
> -- :ProductID: Input Decimal (Size = 0; Prec = 0; Scale = 0) [10]
> -- :ProductName: Input AnsiString (Size = 5; Prec = 0; Scale = 0)
> [prod1]
> 
> ---- SQLite ----
> INSERT INTO "main"."Categories" ("CategoryName", "Description",
> "Picture") VALUES (:CategoryName, ...)
> -- :CategoryName: Input String (Size = 0; Prec = 0; Scale = 0) [cat1]
> 
> SELECT last_insert_rowid()
> 
> INSERT INTO "main"."Products" ("CategoryID", ..., "ProductName", ...)
> VALUES (:CategoryID, ..., :ProductName, ...)
> -- :CategoryID: Input Int32 (Size = 0; Prec = 0; Scale = 0) [9]
> -- :ProductName: Input String (Size = 0; Prec = 0; Scale = 0) [prod1]
> 
> SELECT last_insert_rowid()
> 
> SELECT "Discount", "OrderID", "ProductID", "Quantity", "UnitPrice"
> FROM "main"."Order Details" WHERE ("ProductID" = 78)
> 
> SELECT "CategoryID", "CategoryName", "Description", "Picture" FROM
> "main"."Categories" WHERE ("CategoryID" = 9)
> 
> INSERT INTO "main"."Products" ("CategoryID", ..., "ProductID",
> "ProductName", ...) VALUES
> (:CategoryID, ..., :ProductID, :ProductName, ...)
> -- :CategoryID: Input Int32 (Size = 0; Prec = 0; Scale = 0) [9]
> -- :ProductID: Input Int32 (Size = 0; Prec = 0; Scale = 0) [78]
> -- :ProductName: Input String (Size = 0; Prec = 0; Scale = 0) [prod1]
> 
> --
> Anders
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "DbLinq" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/dblinq?hl=en.


-- 
You received this message because you are subscribed to the Google Groups 
"DbLinq" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/dblinq?hl=en.

Reply via email to