Question

Un jour, je décidé de construire cette belle 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és comme leurs propriétés.

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, est-ce pas ?. Voici la capture. Chacune des classes mappées contient elle-même propriété ID alors j'ai décidé de passer outre comme ceci

[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, ainsi:

public class DivisionWrapper : BaseObjectWrapper<Division>
    {
    }

Il a très bien fonctionné aussi longtemps que je gardais les valeurs d'ID à classe mappée et sa classe BaseObject même (qui est pas très bonne approche, je sais, mais quand même) mais cela est arrivé:

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 sur la mémoire en question l'exception suivante a eu lieu: Les membres du groupe BaseObject.ID est unmapped. Bien que je suis en indiquant le type et en remplaçant les L2S de propriété d'identité ne fonctionne pas. Toutes les suggestions?

Était-ce utile?

La solution

Si je trouve le problème. 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top