的LINQ to SQL实体列名和GUID主键属性被忽略(LINQ to SQL entity co

2019-07-29 11:24发布

我用LINQ一个简单的实体类SQL(SQL服务器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 */
}

只有两个有些有趣的东西在这里:

  1. 类和属性名称是不一样的表和列名
  2. 主键是一个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似乎被忽略列(名称=“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缺陷?

Answer 1:

这是LINQ到SQL的错误。 它是固定在.NET 4.0。

参见连接#381883: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=381883



Answer 2:

你的财产需要“私人”从删除“私订;” 当您在VS 2008中短一手楼盘没有执行的get / set,编译器为你(这名字谁知道)创建私有成员变量。 在ColumnAttribute存储选项指定要使用的私有成员。

LINQ到SQL不知道如何,如果你标记的setter私享吸气公众(不要问我为什么)设置属性。 如果你想使你的财产只读,使私有成员变量像上面一样。

你可以像下面写它清理:

    [Table( Name="TBL_REGISTRATION" )]
    public sealed class Registration : IDataErrorInfo
    {
            public Guid RegistrationID { get { return _registrationID; } }

            [Column( IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
            private Guid _registrationID; 
}


Answer 3:

您是否尝试过使用存储属性?

[Table( Name="TBL_REGISTRATION" )]
public sealed class Registration : IDataErrorInfo
{
        [Column( Name="TBL_REGISTRATION_PK", Storage="_RegistrationID", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert )]
        public Guid RegistrationID { get { return _RegistrationID; } set { _RegistrationID = value; } }

        private Guid _RegistrationID;
    /* other properties ommited for brevity */
}

另请参见基于属性的映射(LINQ到SQL)



Answer 4:

使用“存储”属性,与列的名称:

[Column( Name="TBL_REGISTRATION_PK", Storage="TBL_REGISTRATION_PK", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert )]
        public Guid RegistrationID { get { return _RegistrationID; } set { _RegistrationID = value; } }

由于该列的存储名字是TBL_REGISTRATION_PK。



Answer 5:

我发现这个问题的最佳解决方案是在具有完全相同的名称作为数据库中的主键的类来创建一个私人的Guid领域和使用,为符合框架指引命名属性的支持字段约定。

// Primary key to TBL_REGISTRATIONT
[Column( Name = "TBL_REGISTRATIONT_PK", IsDbGenerated = true, AutoSync = AutoSync.OnInsert )]
public Guid RegistrationID
{
    get
    {
        return TBL_REGISTRATIONT_PK;
    }
    private set
    {
        TBL_REGISTRATIONT_PK = value;
    }
}
[Column( IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert )]
private Guid TBL_REGISTRATIONT_PK;


文章来源: LINQ to SQL entity column name attribute ignored with guid primary key