Estaba trabajando con una clase de entidad simple con LINQ to SQL (SQL Server 2005 SP3 x64).Atributo de nombre de columna de entidad de LINQ a SQL ignorado con la clave principal de guid
[Table(Name="TBL_REGISTRATION")]
public sealed class Registration : IDataErrorInfo
{
[Column(Name = "TBL_REGISTRATION_PK", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public Guid RegistrationID { get; private set; }
/* other properties ommited for brevity */
}
Sólo hay dos cosas poco interesantes aquí:
- Los nombres de las clases y de propiedad no son los mismos que los nombres de tablas y columnas
- La clave principal es un GUID (uniqueidentifier)
Esto es lo que se ve la mesa como:
create table dbo.TBL_REGISTRATION
(
TBL_REGISTRATION_PK uniqueidentifier primary key clustered
rowguidcol
default newid(),
/* other columns ommited for brevity */
)
Cuando hay que adjuntar a esta entidad a mi mesa y incluir cambios en mi DataContext, la pila LINQ lanza de nuevo un SqlException:
SqlException (0x80131904): nombre de columna no válido 'RegistrationID'
LINQ parece ignorar el atributo Column (Name = "TBL_REGISTRATION_PK") en mi propiedad RegistrationID. Pasé un tiempo inmóvil con diferentes decoraciones de atributos tratando de hacer que funcione. Al final me decidí por una propiedad TBL_REGISTRATION_PK privada para envolver mi propiedad RegistrationID y hacer feliz a LINQ.
[Table(Name="TBL_REGISTRATION")]
public sealed class Registration : IDataErrorInfo
{
public Guid RegistrationID { get; private set; }
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
private Guid TBL_REGISTRATION_PK { get { return RegistrationID; } set { RegistrationID = value; } }
/* other properties ommited for brevity */
}
Esto funciona.
¿Por qué no funcionó de la primera manera? ¿Estoy haciendo algo mal aquí o es un defecto LINQ?
Estoy contento de finalmente descubrir que (a) no estoy loco y (b) está siendo reparado. –