Entity Framework4がけ"ApplyCurrentValues"論理によるものか。
-
26-09-2019 - |
質問
を使用している"スタブ技術"を 更新 私POCO(使用戸建の文脈にASP.NET MVC).
このコード私は現在、私のコントローラー(事業所):
[HttpPost]
public ActionResult Edit(Review review)
{
Review originalReview = _userContentService.FindById(review.PostId) as Review;
var ctx = _unitOfWork as MySqlServerObjectContext;
ctx.ApplyCurrentValues("MyEntities.Posts", review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
ご覧のとおりコードの香り。:)
数ポイント:
- 使ってい依存性インジェクション(インターフェースベース)は、基本的にはすべ
- 私のユニットをご利用のパターン抽ObjectContextを提供し続複数のリポジトリ
- 現在、私 IUnitOfWork インタフェースは1の方法:
void Commit();
- コントローラーにて
IUserContentService
やIUnitOfWork
注入によるDI IUserContentService
電話Find
機関リポジトリを使用しObjectContext
.
これら二つのことをいうと、上記のコード:
- 僕はキャストの IUnitOfWork として
MySqlServerObjectContext
. - 私たいと思っているコントローラーにて
ApplyCurrentValues
については基本的にいた私のコードを眺めるようになります:
[HttpPost]
public ActionResult Edit(Review review)
{
_userContentService.Update(review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
そのアイデアかできるんだ!"(う).
すでに持ってい文化宮殿の主体セットの名前をタイプ(組み合わせのジェネリック医薬品,多元化、わからないか心配しなくてよいでしょう。
が ったが、"リーマン-ショックを入れて ApplyCurrentValues
は?ていることに対して適当に入れて、 IUnitOfWork
インタフェースとしてこの持続(EF)に関する懸念同じ理由で属していないのサービスです。を置いので私 MySqlServerObjectContext
クラス(通常、うっすらとしても直接アクセスできるこのクラスで注via DIにはいったい何がある請求 IUnitOfWork
.
意思い?
編集
ビル街は潰れてほしい。以下にスタブを利用した技術が、問題があったかを取得者i am更新前に、例外をスローし、"企業そのキーには既に存在しています。
ある意味では、がんがどのように解決できる。
いただいた"チェックインの場合、企業はすでに添付しない場合は添付のですか?"
大きEF4の専門家がすか?
編集
データが消えるのは注意-解決方法を発見したら、答えします。
解決
板で-簡単ではありませんでしたので、私の説明もできます。(ケ)
コントローラ関連するコード:
// _userContentService is IUserContentService
_userContentService.Update(review);
なので、私のコントローラー電話と呼ばれる手法 Update
月 IUserContentService
, 通信が可能となり、この強型 Review
オブジェクトです。
ユーザコンテンツサービス関連コード
public void Update(Post post)
{
// _userContentRepository is IPostRepository
_userContentRepository.UpdateModel(post);
}
なので、私のサービスの通話と呼ばれる手法 UpdateModel
月 IPostRepository
, 通信が可能となり、この強型 Review
オブジェクトです。
現在、このトリッキーです。
ってい 特定のリポジトリ.してい 汎用リポジトリ という GenericRepository<T> : IRepository<T>
, 取り扱っている すべてのリポジトリ
だから何かを求め IPostRepository
(僕のサービスを行っていた)、ジがで GenericRepository<Post>
.
しかし、今まで PostRepository
:
public class PostRepository : GenericRepository<Post>, IPostRepository
{
public void UpdateModel(Post post)
{
var originalPost = CurrentEntitySet.SingleOrDefault(p => p.PostId == post.PostId);
Context.ApplyCurrentValues(GetEntityName<Post>(), post);
}
}
だから、クラス 由来 から GenericRepository, で、継承すべてのコリポジトリの論理す(追加します。
最初のうに入れる UpdateModel コードの GenericRepository クラス自体及びそれかが必要となるこの特定のリポジトリ)が、問題の論理を取得する既存の主体は特定のキーに GenericRepository<T>
うかがい知れない.
その結果は、 縫製 隠された深部の深さデータの層か、カスタマーサポートコントローラです。
編集
この"スタブ"にも作品:
public void UpdateModel(Post post)
{
var stub = new Review {PostId = post.PostId};
CurrentEntitySet.Attach(stub);
Context.ApplyCurrentValues(GetEntityName<Post>(), post);
}
が、問題が ポスト 文できませんのインスタンスを生成しように申し出なければならないタイプの作成のためのスタブ 毎 派生タイプです。めったにオプションになります。
編集2(最終時)
あの"スタブ技術"と抽象クラスで、現在の並行処理で問題が解決しました。
になっていたため、汎用型のパラメータマ UpdateModel 法により処理し、特別 new()制約.
実施:
public void UpdateModel<T>(T post) where T : Post, new()
{
var stub = new T { PostId = post.PostId };
CurrentEntitySet.Attach(stub);
Context.ApplyCurrentValues(GetEntityName<Post>, post);
}
インターフェース:
void UpdateModel<T>(T post) where T : Post, new();
これらのことからこのタイプのT手動するのを防止並行処理の問題を防外旅行のDBです。
写groovy.
編集3(と思った最後の時間の前後で、時間)
上記の"スタブ"に作品がんを取得するオブジェクト、例外をスローす旨の実体そのキーがすでに存在するのOSM.
誰でもできるので助言をどう扱うか。
編集4(OK-っという感じです。)
この溶液に、今回答: は時にチェックインできる場合にはオブジェクトがすでに所属しているデータベースティさせていただきます。
った"チェックインの場合、企業は添付の"は以下のコード:
ObjectStateEntry entry;
CurrentContext.ObjectStateManager.TryGetObjectStateEntry(entity, out entry);
ですが必ず返されます nullの場合, でも私が考OSMが私の主体が同じ鍵があります。
このコード:
CurrentContext.ObjectStateManager.TryGetObjectStateEntry(CurrentContext.CreateEntityKey(CurrentContext.GetEntityName<T>(), entity), out entry)
その他なんでも)を使用してい純粋な姿の、OSMたトラブル把握、企業のキーの人が知っています。
あとひとつおいしくなるようになっている追加の特定のリポジトリエンティティを制作しました属性という"[EntityKey]"公共財の属性).
すべてのPOCOのは1公共財で飾られた属性から取得するため、例外をスローマリポジトリモジュールです。
私の汎用リポジトリを見この施設を作るために/セットアップのスタブ.
Yes-い反射がな反射(属性ベース)やって反射のためのplularizationティセット名からT.
とにかく、問題を解決すべてのタブ。