2010-06-16 4 views
0

Un jour, j'ai décidé de créer cette application multi-niveaux en utilisant L2S et WCF. Le modèle simplifié est: DataBase-> L2S-> Wrapper (DTO) -> Application client. La communication entre le client et la base de données est réalisée à l'aide d'objets de transfert de données qui contiennent des objets d'entité en tant que leurs propriétés.Applications multiniveaux utilisant L2S, WCF et la classe de base

abstract public class BaseObject 
    { 
    public virtual IccSystem.iccObjectTypes ObjectICC_Type 
      { 
       get { return IccSystem.iccObjectTypes.unknownType; } 
      } 

      [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_ID", AutoSync = AutoSync.OnInsert, DbType = "BigInt NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] 
      [global::System.Runtime.Serialization.DataMemberAttribute(Order = 1)] 
      public virtual long ID 
      { 
       //get; 
       //set; 
       get 
       { 
        return _ID; 
       } 
       set 
       { 
        _ID = value; 
       } 
      } 
    } 

    [DataContract] 
    public class BaseObjectWrapper<T> where T : BaseObject 
    { 
     #region Fields 

     private T _DBObject; 

     #endregion 
     #region Properties 

     [DataMember] 
     public T Entity 
     { 
      get { return _DBObject; } 
      set { _DBObject = value; } 
     } 

     #endregion 
} 

Assez simple, n'est-ce pas? Voici la capture. Chacune des classes mappées contient ID propriété elle-même donc je décidé de passer outre comme cette

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Divisions")] 
    [global::System.Runtime.Serialization.DataContractAttribute()] 
    public partial class Division : INotifyPropertyChanging, INotifyPropertyChanged 
{ 
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] 
     [global::System.Runtime.Serialization.DataMemberAttribute(Order=1)] 
     public override long ID 
     { 
      get 
      { 
       return this._ID; 
      } 
      set 
      { 
       if ((this._ID != value)) 
       { 
        this.OnIDChanging(value); 
        this.SendPropertyChanging(); 
        this._ID = value; 
        this.SendPropertyChanged("ID"); 
        this.OnIDChanged(); 
       } 
      } 
     } 
} 

Wrapper pour la division est assez simple aussi bien:

public class DivisionWrapper : BaseObjectWrapper<Division> 
    { 
    } 

Il a fonctionné assez bien aussi longtemps que je continuais les valeurs d'ID à classe mappée et sa classe BaseObject même (ce n'est pas très bonne approche, je sais, mais quand même), mais alors cela se produisait:

private CentralDC _dc; 

    public bool UpdateDivision(ref DivisionWrapper division) 
      { 
       DivisionWrapper tempWrapper = division; 
       if (division.Entity == null) 
       { 
        return false; 
       } 
       try 
       { 
        Table<Division> table = _dc.Divisions; 
        var q = table.Where(o => o.ID == tempWrapper.Entity.ID); 
        if (q.Count() == 0) 
        { 
         division.Entity._errorMessage = "Unable to locate entity with id " + division.Entity.ID.ToString(); 
         return false; 
        } 
        var realEntity = q.First(); 
        realEntity = division.Entity; 
        _dc.SubmitChanges(); 
        return true; 
       } 
       catch (Exception ex) 
       { 
        division.Entity._errorMessage = ex.Message; 
        return false; 
       } 
      } 

Lorsque vous essayez d'énumérer plus e La requête en mémoire L'exception suivante s'est produite: Le membre de classe BaseObject.ID est démappé. Bien que j'indique le type et remplace la propriété d'ID, L2S ne fonctionne pas. Des suggestions? Supposons que j'ai trouvé le problème.

Répondre

1

Lors de l'écriture

var q = table.Where(o => o.ID == tempWrapper.Entity.ID); 

le compilateur implique que l'objet est de type BaseObject et tente donc d'obtenir sa valeur d'identification de la cartographie BaseObject et il est non cartographiées. Le problème semble être résolu en déclarant explicitement le type:

var q = from Division div in _dc.GetTable<Division>() 
         where div.ID == tempWrapper.Entity.ID 
         select div; 
Questions connexes