Ich arbeitete mit einer einfachen Entitätsklasse mit LINQ to SQL (SQL Server 2005 SP3 x64).LINQ to SQL Entitätsspaltenname Attribut ignoriert mit GUID Primärschlüssel
[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 */
}
Es gibt nur zwei etwas Interessantes hier:
- die Klassen- und Eigenschaftsnamen sind nicht die gleichen wie die Tabellen- und Spaltennamen
- Der Primärschlüssel ist ein Guid (unique)
Hier ist, was die Tabelle wie folgt aussieht:
create table dbo.TBL_REGISTRATION
(
TBL_REGISTRATION_PK uniqueidentifier primary key clustered
rowguidcol
default newid(),
/* other columns ommited for brevity */
)
Wenn ich diese Einheit an meinen Tisch befestigen und senden Sie Änderungen auf meinem Datacontext, wirft die LINQ-Stack eine SqlException zurück:
SqlException (0x80131904): Ungültige Spaltenname
‚RegistrationID‘LINQ zu sein scheint zu ignorieren Das Attribut "Column (Name =" TBL_REGISTRATION_PK ") für meine Eigenschaft" RegistrationID ". Ich verbrachte eine Weile damit, verschiedene Attribute zu dekorieren, um es zum Laufen zu bringen. Am Ende entschied ich mich für eine private TBL_REGISTRATION_PK -Eigenschaft, um meine Eigenschaft "RegistrationID" zu verpacken, um LINQ glücklich zu machen.
[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 */
}
Dies funktioniert.
Warum hat es nicht die erste Möglichkeit funktioniert? Mache ich hier etwas falsch oder ist das ein LINQ-Defekt?
Ich bin froh, endlich zu entdecken, dass (a) ich nicht verrückt bin und (b) es repariert wird. –