0

参照オブジェクトとして使用するエンティティの読み取り専用 (または不変) バージョンを作成する方法を探しています。例えば

class Order
{
   public int OrderId {get; private set;}

   public virtual Product ProductOrdered{get;set;}
   public int ProductId {get;set;}

   public int Quantity{get;set;}
}

class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
}

上記の例では、製品は参照データとして使用されることになっています。すなわち、製品は、注文の参照として製品を使用するコードによって変更されるべきではありません。

今、それを強制する1つの方法は、すべてのセッターをプライベートにすることであり、誰も製品を変更できないことに気付きました...

class ProductReadOnly
{
    public int ProductId { get; private set; }
    public string Name { get; private set; }
    public string Category { get; private set; }
}

しかし、アプリのどこかで、管理者が製品を作成/変更できるようにしたいと考えています。したがって、クラス Product を使用できます (パブリック セッターを使用)

質問は次のとおりです(Table属性を使用してProductとProductReadOnlyを製品テーブルにマップできると仮定します)

  1. Order クラスのナビゲーション プロパティとして ProductReadOnly を使用できますか?
  2. Product と ProductReadOnly (同じ製品) を同じデータ コンテキストで読み込むことはできますか?
  3. それを行う簡単な方法はありますか (デタッチされたオブジェクト?)
  4. このアプローチに問題はありますか?
4

1 に答える 1

2

ソリューションのように 2 つのエンティティを保持する必要はありません。コンテキストで SaveChanges をオーバーライドし、このような製品の編集/追加を無効/有効にすることができます。

    public override int SaveChanges()
    {
      if(currentUserIsNotAnAdmin){
      var entries= ObjectStateManager.GetObjectStateEntries(EntityState.Added |   
   EntityState.Modified).OfType<Product>() ;
        foreach(entry in entries){//or throw an error here
          this.Entry(entry).State=System.Data.EntityState.Unchanged
        }
      }
        return base.SaveChanges();
    }

ここでは、現在のユーザーが管理者でない場合、製品エンティティの変更の保存を無効にしています。または、タイプの変更/追加されたエントリがある場合は、エラーをスローできますProduct

于 2013-03-29T03:34:22.740 に答える