Posterior a indagar en varios repositorios y foros al final nos encontramos con la solución que te mostraremos a continuación.
Solución:
De acuerdo con esta pregunta anterior, debe comenzar una transacción de su contexto. Después de guardar el cambio, también debe volver a establecer la columna Insertar identidad y, finalmente, debe confirmar la transacción.
using (var db = new AppDbContext())
using (var transaction = db .Database.BeginTransaction())
var item = new IdentityItem Id = 418, Name = "Abrahadabra" ;
db.IdentityItems.Add(item);
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Test.Items ON;");
db.SaveChanges();
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Test.Items OFF");
transaction.Commit();
No respeté las etiquetas de la pregunta que indica que se trata de EF6.
Esta respuesta funcionará para EF Core
El verdadero culpable aquí no es la transacción faltante, sino el pequeño inconveniente, que Database.ExectueSqlCommand()
no mantendrá abierta la conexión, cuando no se haya abierto explícitamente antes.
using (var db = new AppDbContext())
var item = new IdentityItem Id = 418, Name = "Abrahadabra" ;
db.IdentityItems.Add(item);
db.Database.OpenConnection();
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Test.Items ON;");
db.SaveChanges();
también lo hará, ya que SET IDENTITY_INSERT [...] ON/OFF
estará vinculado a su conexión.
Para obligar a EF a escribir el ID de su entidad, debe configurar el ID como no generado en la tienda; de lo contrario, EF nunca incluirá el ID en la declaración de inserción.
Por lo tanto, debe cambiar el modelo sobre la marcha y configurar la identificación de la entidad según lo necesite.
El problema es que el modelo está en caché y es bastante complicado cambiarlo sobre la marcha (estoy bastante seguro de que lo he hecho, pero en realidad no puedo encontrar el código, probablemente lo tiré). La forma más corta es crear dos contextos diferentes donde configure su entidad de dos maneras diferentes, como DatabaseGeneratedOption.None
(cuando necesites escribir el ID) y como DatabaseGeneratedOption.Identity
(cuando necesite el ID de autonumeración).
Comentarios y valoraciones del artículo
Si te ha resultado útil este artículo, sería de mucha ayuda si lo compartes con más desarrolladores y nos ayudes a extender nuestro contenido.