Многоуровневые приложения, использующие L2S, WCF и базовый класс

StackOverflow https://stackoverflow.com/questions/3053204

Вопрос

Однажды я решил построить это хорошее многоуровневое приложение, используя L2S и WCF. Упрощенная модель: база данных-> L2S-> обертка (Dто) -> клиентское приложение. Связь между клиентом и базой данных достигается с использованием объектов передачи данных, которые содержат объекты объекта в качестве свойств.

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
}

Довольно просто, не так ли? Вот улов. Каждый из сопоставленных классов содержит саму удостоверение личности, поэтому я решил переопределить это, как это

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

Обертка для разделения довольно прост, а также:

public class DivisionWrapper : BaseObjectWrapper<Division>
    {
    }

Он работал довольно хорошо, так как я сохранял идентификационные ценности в сопоставленном классе и его классе BaseObject, то же самое (это не очень хороший подход, я знаю, но все еще) но тогда это произошло:

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

При попытке перечислять запрос в памяти. Произошло следующее исключение: Class-член BASABJECT.ID не включен. Хотя я заявию тип и переопределил ID свойство L2S, не работает. Какие-либо предложения?

Это было полезно?

Решение

Предположим, я нашел проблему. При написании

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

Компилятор подразумевает, что объект имеет тип BasonObject и, следовательно, пытается получить значение ID из сопоставления BaseObject, и он не включен. Проблема, похоже, решается явно объявлением типа:

var q = from Division div in _dc.GetTable<Division>()
                        where div.ID == tempWrapper.Entity.ID
                        select div;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top