/ / Marca de tiempo de Linq a SQL que abarca dos tablas: c #, sql-server, linq a sql, concurrencia

Marca de tiempo de Linq-to-Sql que abarca dos tablas: c #, servidor sql, linq-to-sql, concurrencia

Estoy usando una columna de marca de tiempo de SQL Server (llamadaVersionNumber) para admitir la concurrencia optimista con Linq-to-SQL. Esto funciona bien cuando solo hay una tabla involucrada. Sin embargo, tengo entidades de dominio que se ven así:

Persona: Nombre, Apellido, Edad, Número de versión
Doctor: todas las propiedades de la persona + profesión
Atleta: todas las propiedades Persona + Deporte, AñosPro
Músico: todas las propiedades Persona + Instrumento

Mi base de datos tiene una tabla Persona y luego otras tablaspara cada tipo de persona. Las mesas de concreto (como Atleta) solo tienen las columnas necesarias para el atleta. Las tablas concretas tienen un mapeo 1-1 con la tabla Persona. ¿Cómo uso VersionNumber en este caso? ¿Pueden / deben las tablas concretas tener su propia columna VersionNumber? ¿Debería la tabla Persona tener la columna VersiónNúmero? ¿Cómo debo guardar los datos en este escenario?

En este caso particular, quiero salvar al atleta. En este momento, solo la clase base Persona tiene VersionNumber. No estoy seguro de cómo guardar esto.

Nota: Debido a que la persona ya tiene una propiedad VersionNumber en la entidad de dominio C #, no puedo agregar el mismo nombre de propiedad a las clases concretas.

Respuestas

1 para la respuesta № 1

linq-to-sql soporta herencia de una sola mesa, por lo que si puede rediseñar su base de datos, debe crear una tabla con todos los campos. Luego agregas un type campo que le dirá a linq-to-sql qué tipo de concreto se materializa para cada fila en particular.

Si eso no es una opción, el bloqueo optimistatiene que hacerse por tabla. Agregue una columna VersionNumber a cada tabla y linq-to-sql la usará. La forma en que lo tienes ahora también funciona. Linq-to-sql usará el VersionNumber del Person tabla y recurrir a afirmar que cadaLa propiedad no se modifica al actualizar las otras tablas. Si alguna de las propiedades se ha cambiado en la base de datos desde que eran rojas, linq-to-sql fallará la actualización con un error de concurrencia.