使用guid主键忽略LINQ to SQL实体列名称属性

Bri*_*ter 11 c# linq sql-server sql-server-2005 linq-to-sql

我正在使用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 */
}
Run Code Online (Sandbox Code Playgroud)

这里只有两件有趣的事情:

  1. 类和属性名称与表名和列名不同
  2. 主键是Guid(uniqueidentifier)

这是表格的样子:

 create table dbo.TBL_REGISTRATION
    (
    TBL_REGISTRATION_PK uniqueidentifier primary key clustered
        rowguidcol
        default newid(),
    /* other columns ommited for brevity */ 
    )
Run Code Online (Sandbox Code Playgroud)

当我将此实体附加到我的表并在我的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 */
}
Run Code Online (Sandbox Code Playgroud)

这有效.

为什么它不是第一种方式?我在这里做错了还是LINQ缺陷?

Kri*_*erA 6

这是Linq-to-SQL中的一个错误.它在.net 4.0中修复.

请参阅连接#381883:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx 反馈ID = 381883