11
votes

LINQ to SQL Entity Name Attribut Ignoré avec la clé primaire GUID

Je travaillais avec une classe d'entité simple avec LINQ vers SQL (SQL Server 2005 SP3 X64).

[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 */
}


0 commentaires

5 Réponses :


0
votes

Avez-vous essayé d'utiliser le Stockage Propriété? XXX

Voir aussi Mappage à base d'attributs (LINQ à SQL)


1 commentaires

Nan. Bonne idée, mais cela ne fonctionne certainement pas: "Nom de colonne invalide" Enregistrement "."



0
votes

Utilisez la propriété "Stockage", avec le nom de la colonne: xxx

car le nom de stockage de la colonne est Tbl_registration_pk.


1 commentaires

Merci de jouer mais cela ne fonctionne pas. Il provoquera une introduction à une invalidationException d'être lancée au moment de l'exécution, car il n'y a pas de champ ou de propriété Tbl_registration_PK dans la classe. La propriété ColuminateTtribute.Storage est destinée à indiquer un champ privé qui contient les données qui contiennent la propriété que vous décorez avec l'attribut.



2
votes

Votre propriété a besoin de «privé» retiré de «Set privé»; Lorsque vous effectuez les propriétés courtes dans VS 2008 sans implémenter GET / SET, le compilateur crée des variables de membre privées pour vous (de quel nom qui sait). L'option de stockage de Columnattribute Spécifie quel membre privé à utiliser.

LINQ to SQL ne sait pas comment définir la propriété si vous marquez le Setter Private et que vous avez le public getter (ne me demandez pas pourquoi). Si vous souhaitez effectuer votre propriété en lecture seule, faites une variable de membre privé comme vous l'avez fait ci-dessus. P>

Vous pouvez le nettoyer en l'écrivant comme suit: P>

    [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; 
}


0 commentaires

0
votes

La meilleure solution que j'ai trouvée dans ce problème est de créer un champ GUID privé dans la classe qui présente exactement le même nom que la clé principale de la base de données et l'utiliser comme champ de support pour la propriété conforme à la propriété. Conventions de nommage de la directive-cadre.

// 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;


0 commentaires

6
votes

Ceci est un bogue dans LINQ-TO-SQL. Il est fixé dans .NET 4.0.

Voir Connect # 381883: https://connect.microsoft.com/visualstudio/feedback/vieweedback.aspx ? FeedBackID = 381883


1 commentaires

Je suis heureux de finalement découvrir cela (a) Je ne suis pas fou et (b) il est corrigé.