Я работал с простым классом сущностей с LINQ to SQL (SQL Server 2005 SP3 x64).
[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 */
}
Здесь всего две интересные вещи:
- Имена классов и свойств не совпадают с именами таблиц и столбцов
- Первичный ключ - это Guid (uniqueidentifier)
Вот что выглядит таблица:
create table dbo.TBL_REGISTRATION
(
TBL_REGISTRATION_PK uniqueidentifier primary key clustered
rowguidcol
default newid(),
/* other columns ommited for brevity */
)
Когда я присоединяю этот объект к своей таблице и отправляю изменения в свой DataContext, стек LINQ возвращает исключение SqlException:
SqlException (0x80131904): Недопустимое имя столбца 'RegistrationID'
LINQ, похоже, игнорирует атрибут Column (Name = "TBL_REGISTRATION_PK" ) в моем свойстве RegistrationID. Я провел некоторое время с разными атрибутами атрибутов, пытаясь заставить его работать. В конце концов я остановился на частном свойстве TBL_REGISTRATION_PK, чтобы обернуть мое свойство RegistrationID, чтобы сделать 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 */
}
Это работает.
Почему он не работал первым способом? Я делаю что-то неправильно здесь или это дефект LINQ?