L2、WCF、およびベースクラスを使用したマルチ層アプリケーション
-
27-09-2019 - |
質問
ある日、私はL2とWCFを使用してこの素敵なマルチ層アプリケーションを構築することにしました。簡素化されたモデルは、データベース - > l2s-> wrapper(dto) - >クライアントアプリケーションです。クライアントとデータベース間の通信は、エンティティオブジェクトをそのプロパティとして含むデータ転送オブジェクトを使用することにより実現されます。
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
}
とてもシンプルですね。これがキャッチです。マッピングされたクラスのそれぞれにはIDプロパティ自体が含まれているので、このようにオーバーライドすることにしました
[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クラスでID値を同じように保持している限り、それは非常にうまく機能しました(それはそれほど良いアプローチではありません、私は知っていますが、それでもこれは起こりました:これは起こりました:
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;
}
}
メモリ内クエリを列挙しようとすると、次の例外が発生しました。クラスメンバーBaseObject.idはマップされていません。私はタイプを述べており、IDプロパティをオーバーライドしていますが、L2Sは機能しません。助言がありますか?
解決
var q = table.Where(o => o.ID == tempWrapper.Entity.ID);
コンパイラは、オブジェクトがBaseObjectタイプであるため、BaseObjectマッピングからID値を取得しようとすることを意味し、マップされていません。問題は、タイプを明示的に宣言することによって解決されるようです。
var q = from Division div in _dc.GetTable<Division>()
where div.ID == tempWrapper.Entity.ID
select div;
所属していません StackOverflow