2016-07-27 31 views
1

I Verfahren zu meinem Modell mit folgendem Code kartiert gespeichert:Entity Framework MySQL gespeicherte Prozedur

modelBuilder.Entity<Account>() 
      .MapToStoredProcedures(p => p.Insert(sp => sp.HasName("sp_InsertAccount")) 
      .Update(sp => sp.HasName("sp_UpdateAccount")) 
      .Delete(sp => sp.HasName("sp_DeleteAccount")) 
      ); 

aber wenn ich Datensatz hinzufügen mit:

bank.AccountsMoves.Add(entity); 

werfen Fehler:

An unhandled exception of type 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' occurred in EntityFramework.dll

Additional information: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.

Die SQL-Anweisung für gespeicherte Prozedur lautet:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_InsertAccountMove`(
IN type int(11), 
IN account_id int(11), 
IN accountant_id int(11), 
IN amount int(11), 
IN date datetime 
) 
BEGIN 
INSERT INTO `bank`.`accounts_moves` 
(`type`, `account_id`, `accountant_id`, `amount`, `date`) 
VALUES (type, account_id, 
(SELECT id FROM accountant 
Where name = SUBSTRING_INDEX(USER() ,'@',1)) 
, amount, NOW()); 

END 

ich denke, dass mysql gespeicherte Prozedur nicht die Anzahl der betroffenen Zeilen zurückgibt

Ich bin mit EF 6.0, MySQL 5.7

Weiß jemand, wie man diesen Fehler zu beheben, den richtigen Weg?

+1

Warum Entity Framework überhaupt, wenn Sie nur gespeicherte Prozeduren gehen zu rufen? Vielleicht sollten Sie etwas leichter als Dapper betrachten –

+0

@DavidL Dies ist eine Möglichkeit, die normalen CUD-Anweisungen auf [gespeicherte Prozeduren] (https://msdn.microsoft.com/en-us/data/dn468673.aspx?f=255&MSPPError) umzuleiten = -2147217396). Das Lesen wird mit regulären LINQ-Anweisungen durchgeführt. –

+0

Ich bin nicht mit Mysql-Syntax vertraut, aber der Sproc sollte generierte Schlüsselwert (e) der neu eingefügten Zeile (wenn es irgendwelche generierten Schlüsselwerte gibt) zurückgeben. Und Werte von berechneten Feldern (falls vorhanden). –

Antwort

0

löste ich das Problem zu letzten Zeile sproc folgende Zeile hinzufügen :

SELECT * FROM `bank`.`accounts_moves` WHERE id = LAST_INSERT_ID(); 
+0

Und ich denke, es ist genug, nur die ID auszuwählen. –

Verwandte Themen