3

そこで、SQL Compact Edition の上に Entity Framework を使用してアプリを構築しています。Entites をビジネス オブジェクトとして使用するという考えが気に入らなかったので、レイヤー (私はそれを ObjectModel レイヤーと呼んでいますが、おそらく最適な用語ではありません) を構築してきました。エンティティを入力して保存します。逆もまた同様です - エンティティを取得し、ビジネス オブジェクトとして使用するために POCO を入力します


Customer という POCO オブジェクトがあるとします。

public class Customer:ICustomer
    {


        #region ICustomer Members

        public System.Guid id {get;set;}


        public string Forename {get;set;}


        public string Surname { get; set; }


        #endregion
    }

そして、ObjectModel レイヤーを使用してこれを設定したいと思います。私は現在これをやっています...

OM_Customer<ICustomer,Entity.Customer> customerLayer = new OM_Agent<ICustomer,Entity.Customer>();

ICustomer businessObject = customerLayer.GetById(new Guid("4a75d5a5-6f5a-464f-b4b3-e7807806f1a9"));

OM_Customer クラスは、以下の ObjectModelBase から継承されます。

public abstract class ObjectModelBase<BllClass, EntityClass>
{
    public DataStoreEntities1 db;

    public EntityClass _dataObject;

    public string setName;


    #region POCO-ORM Mapping Functions
    public EntityClass MapBLLToEntity(BllClass bllObject)
    {
        Mapper.CreateMap<BllClass, EntityClass>();
        return Mapper.Map<BllClass, EntityClass>(bllObject);
    }

    public BllClass MapEntityToBLL(EntityClass entityObject)
    {
        Mapper.CreateMap<EntityClass, BllClass>();
        return Mapper.Map<EntityClass, BllClass>(entityObject);
    }
    #endregion

    public void Save(BllClass toAdd)
    {
        _dataObject = MapBLLToEntity(toAdd);

        using (db = new DataStoreEntities1())
        {
            db.AddObject(setName, _dataObject);
            db.SaveChanges();
        }
    }

    public BllClass GetById(Guid id)
    {
        using (db = new DataStoreEntities1())
        {
            EntityClass result = (EntityClass)((object)(from c in  db.CustomerSet  where c.id == id select c).First());
            return MapEntityToBLL(result);
        }

    }

}

ここでの問題は、GetByIdメソッドにあります。Save メソッドは、すべての Entity Framework オブジェクト コンテキストに AddObject() メソッドがあるため、サブクラスで問題なく使用できます。

ただし、すべてのエンティティに id というプロパティがあるため、一般的な getById メソッドが必要です (データベースでも主キーである)。問題は、linq がここにあることです...

ModelClass result = (ModelClass)((object)(from c in  db.CustomerSet  where c.id == id select c).First());

db.CustomerSetに固有です。この抽象クラスで、すべてのエンティティに対して汎用の CRUD/ページング/「コレクションの取得」を提供したいと考えていますが、キーストロークを繰り返さなくても、この単純な GetById メソッドのせいで助けを求めるようになりました。

現在のアイデア:

  • クエリ文字列の作成をより詳細に制御できるエンティティ SQL を使用して、ID で取得します。
  • 完全に抽象化するには時間がかかりすぎる可能性があるため、エンティティ フレームワークと linq を破棄します。

SO コミュニティが上記の問題を解決する方法についてアドバイスをいただければ幸いです。

4

1 に答える 1