【发布时间】:2010-11-07 05:25:05
【问题描述】:
我正在使用带有 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(唯一标识符)
表格如下所示:
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 似乎忽略了我的 RegistrationID 属性上的 Column(Name = "TBL_REGISTRATION_PK") 属性。我花了一段时间尝试不同的属性装饰,试图让它发挥作用。最后,我选择了一个私有 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 缺陷?
【问题讨论】:
标签: c# sql-server linq sql-server-2005 linq-to-sql