0

EF 5.0 でマスター データ管理を使用するアプリケーションを実行していますが、アイテムの読み込み、保存などは常に同じであるため、可能な限り一般的なものにしたいと考えています。

私のエンティティは次のようになります。

// IDBEntity.cs
public interface IDBEntity<T>
{
    public int ID { get; }

    ...
}

// Product.cs (Generated)
public class Product
{
    public int ProductID
    {
        get; set;
    }

    public string Name
    {
        get; set;
    }
}

// ProductExtension.cs
public patial class Product : IDBEntity<Product>
{
    public int ID
    {
        get
        {
            return ProductID
        }
    }
}

場合によっては ID のクエリを実行したいのですが、カスタム プロパティを使用して LINQ to Entity クエリを実行できないという問題があります。

public class MasterDataViewModel<T> :  where T : IDBEntity, new()
{
    public T CurrentItem { get; set; }

    public void ReloadItem(int id)
    {
        using (var context = new DatabaseContext())
        {
            // This is the problem
            CurrentItem = context.Set<T>.FirstOrDefault(x => x.ID == id)
        }
    }
}

おそらく実際のIDを指す式でこれを行うことは可能ですか? このようなもの:

public interface IDBEntity<T>
{
    public Expression<Func<T, int>> { get; }
}

public patial class Product : IDBEntity<Product>
{
    public Expression<Func<Product, int>> ID
    {
        get
        {
            return x => x.ProductID
        }
    }
}

この問題に対する他のより良い解決策はありますか?

4

2 に答える 2

1

同じケースで、次のコードを使用しました。

public class BaseEntity
{
    public int Id { get; set; }
}

だからあなたのProduct意志は次のようになります

public class Product : BaseEntity
{    
    public string Name { get; set; }
}

MasterDataViewModel

public class MasterDataViewModel<T> :  where T : BaseEntity, new()
{
    public T CurrentItem { get; set; }

    public void ReloadItem(int id)
    {
        using (var context = new DatabaseContext())
        {
            CurrentItem = context.Set<T>.FirstOrDefault(x => x.Id == id)
        }
    }
}
于 2013-10-02T10:34:39.837 に答える
1

DbSetでFindメソッドを使用する

public class MasterDataViewModel<T> :  where T : IDBEntity, new()
{
    public T CurrentItem { get; set; }

    public void ReloadItem(int id)
    {
        using (var context = new DatabaseContext())
        {
            CurrentItem = context.Set<T>().Find(id);
        }
    }
}
于 2013-10-02T10:40:52.237 に答える