Pregunta

No he estado trabajando en SQL demasiado tiempo, pero creí entender que envolviendo las sentencias SQL dentro de una transacción, todas las declaraciones completado, o ninguno de ellos lo hicieron. Aquí está mi problema. Tengo un objeto para que tenga una colección línea de pedido. Los elementos de línea se relacionan en order.OrderId. He comprobado que todos los ID se establecen y son correctas pero cuando intento de salvar (insertar) la orden que estoy recibiendo La sentencia INSERT en conflicto con el EXTERIOR KEY "FK_OrderItemDetail_Order". Conflicto en la base de datos "MyData", tabla "dbo.Order", la columna 'OrderId'.

pseudo código:

create a transaction
transaction.Begin()
Insert order
Insert order.LineItems <-- error occurs here
transaction.Commit

código real:

...
entity.Validate();
if (entity.IsValid)
{
    SetChangedProperties(entity);
    entity.Install.NagsInstallHours = entity.TotalNagsHours;
    foreach (OrderItemDetail orderItemDetail in entity.OrderItemDetailCollection)
    {
        SetChangedOrderItemDetailProperties(orderItemDetail);
    }
    ValidateRequiredProperties(entity);
    TransactionManager transactionManager = DataRepository.Provider.CreateTransaction();
    EntityState originalEntityState = entity.EntityState;
    try
    {
        entity.OrderVehicle.OrderId = entity.OrderId;
        entity.Install.OrderId = entity.OrderId;
        transactionManager.BeginTransaction();

        SaveInsuranceInformation(transactionManager, entity);
        DataRepository.OrderProvider.Save(transactionManager, entity);
        DataRepository.OrderItemDetailProvider.Save(transactionManager, entity.OrderItemDetailCollection);             if (!entity.OrderVehicle.IsEmpty)
        {
            DataRepository.OrderVehicleProvider.Save(transactionManager, entity.OrderVehicle);
        }
        transactionManager.Commit();
    }
    catch
    {
        if (transactionManager.IsOpen)
        {
            transactionManager.Rollback();
        }
        entity.EntityState = originalEntityState;
    }
}
...

Alguien sugirió que necesito utilizar dos operaciones, una para el orden, y uno de los elementos de línea, pero estoy razonablemente seguro de que es un error. Pero he estado luchando contra esto durante más de un día de estos y tengo que resolverlo para que pueda seguir adelante, incluso si eso significa que el uso de un mal trabajo alrededor. ¿Estoy tal vez sólo haciendo algo estúpido?

¿Fue útil?

Solución

Me di cuenta de que usted ha dicho que estaba utilizando NetTiers para su generación de código.

He usado NetTiers mí mismo y he encontrado que si se elimina su restricción de clave externa de la tabla, se vuelve a agregar la misma mesa y luego ejecutar los scripts de creación para NetTiers de nuevo después de realizar los cambios en la base de datos podría ayudar a restablecer la capa de acceso de datos. He intentado esto en ocasiones con resultados positivos.

Buena suerte con su problema.

Otros consejos

Sin ver su código, es difícil decir cuál es el problema. Podría ser cualquier número de cosas, pero mira los siguientes:

  1. Esto es obvio, pero sus dos comandos de inserción están en la misma conexión (y la conexión permanece abierto todo el tiempo) que posee la transacción derecho?
  2. ¿Está recuperando su identificación en relación con la restricción después de la primera inserción y escribir de nuevo en los datos para la segunda inserción antes de ejecutar el comando?
  3. La restricción puede ser configurado mal en la base de datos.

Definitivamente no desea utilizar dos transacciones.

Parece que su estado de inserción para los Elementos de línea no es establecer correctamente el valor de la orden .. esto debería ser un resultado de la etapa Insert order. ¿Usted ha mirado (y probado) el individuo sentencias SQL?

No creo que el problema no tiene nada que ver con el control de transacciones.

No tengo experiencia con esto, pero parece que es posible que haya especificado un valor clave que no está disponible en la tabla padre. Lo siento, pero no puedo ayudarle más que esto.

El problema es cómo manejar el error. Cuando se produce un error, una transacción no se enrolla automáticamente de nuevo. Por supuesto que puede (y probablemente debería) decide hacer eso, pero dependiendo de su aplicación o dónde se encuentra todavía puede querer cometerlo. Y en este caso, eso es exactamente lo que está haciendo. Es necesario para envolver algo de código de gestión de errores por ahí a deshacer su código cuando se produce el error.

El error parece que no se les está dando las ArtículosLínea el correcto FK OrderId que se genera automáticamente por el inserto de la Orden de la Tabla de Orden. Usted dice haber comprobado las identificaciones, ¿Usted ha comprobado los FKs en los detalles de la orden, así?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top