2009-03-16 7 views
4

J'ai une propriété ("IsLatest") que j'ai mis 'en lecture seule' 'True'Comment créer une propriété 'ReadOnly' dans LINQ to SQL?

Voici le XML:

<Column Name="IsLatest" Type="System.Boolean" DbType="Bit NOT NULL" IsReadOnly="true" CanBeNull="false" /> 

Pourquoi le générateur de code générer un public 'get' ET 'SET' accesseur?

De même, existe-t-il un moyen de le faire pas générer un SET pour une propriété en lecture seule (quelle nouvelle idée)?

NOTE: J'utilise V2008 SP1 avec .NET 3.5 SP1

+0

Utilisez-vous 3.5SP1? le SP1 peut être important ... –

+0

Oh, et VS2008 SP1 –

Répondre

0

EDIT: J'ai ajouté ma solution de contournement réussie au bas de cette réponse.

C'est étrange ... mais, si je mets la propriété "accès" à autre chose que 'public', le "set" disparaît:

Avec "accès = public" et « ReadOnly = True ":

public bool IsLatest 
{ 
    get 
    { 
     return this._IsLatest; 
    } 
    set 
    { 
     if ((this._IsLatest != value)) 
     { 
      this.OnIsLatestChanging(value); 
      this.SendPropertyChanging(); 
      this._IsLatest = value; 
      this.SendPropertyChanged("IsLatest"); 
      this.OnIsLatestChanged(); 
     } 
    } 
} 

Avec "Accès = protégé" et "ReadOnly = True":

protected bool IsLatest 
{ 
    get 
    { 
     return this._IsLatest; 
    } 
} 

Je ne sais pas pourquoi ce bug existe (pour moi au moins?), mais si je obtenir ceci pour travailler (public, et en lecture seule), je mettrai à jour cette réponse.

EDIT: Voici la solution de contournement triste:

J'ai enlevé la propriété de mon dossier DBML, et simplement ajouté ma propre classe « partielle » et définissez la colonne moi-même:

public partial class ServicerData 
{ 
    private bool _IsLatest = default(bool); 

    [Column(Storage = "_IsLatest", AutoSync = AutoSync.Always, DbType = "Bit NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)] 
    public bool IsLatest 
    { 
     get 
     { 
      return this._IsLatest; 
     } 
    } 
} 

C'est pas ce que je veux faire, mais il semble qu'il n'y ait pas d'autre moyen. Puis-je poser une nouvelle fois la question?

0

Comment LINQ to SQL être en mesure d'attribuer une valeur à cette propriété s'il n'y a pas setter? Cela signifie que si elle récupère des données de la base de données, que ce soit via une requête Linq ou un résultat d'une procédure de stockage, Linq doit être capable de créer ces objets pour vous en fonction de ces résultats. S'il n'y a pas de propriété set, elle ne peut pas le faire.

+0

Le setter doit être protégé dans ce cas. – sgriffinusa

+0

re ho il va le régler? ColumnAttribute (et le méta-modèle) vous permet de spécifier la propriété Storage en tant que champ privé. –

2

Modifier: Je viens de vérifier, et n'a pas générer un setter ... utilisez-vous 3.5SP1?


Si vous le faites à la main, je pense que vous pouvez; vous utilisez simplement la propriété d'attribut Stockage (sur ColumnAttribute) pour le pointer sur le champ lors de la mise à jour (l'obtention satisfait aux exigences de la requête).

+0

Eh bien, le problème est que je ne veux pas que le compilateur permette à quelqu'un de "définir" le champ quand il fait un "nouveau". - Intéressant que le tien n'ait pas généré de set. –

+0

BTW: J'utilise V2008 SP1 avec .NET 3.5 SP1 –

+1

Je vois aussi cela avec VS2010, .NET 4.0. –