2017-12-27 23 views
0

へのviewmodelのマッピングリポジトリクラスのUpdateUserは次のとおりです。が正しくように私は私のエンティティを持っている実体

public void UpdateUser(User u) 
    {   
    var user = GetUserDetails(u.Id); 

    user.Name = u.Name; 
    user.Address = u.Address; 

    //using entity framework to save 
    _context.SaveChanges(); 
    } 

どのように私は正しく私のエンティティに私のコントローラでUserViewModelをマッピングすることができ

+0

正しい方法は、以下で説明するようにAutoMapperを使用していると私の答えを見て、あなたのフィードバックを教えてください。 – Aria

答えて

0

AutoMapperを使用することによりあなたのような何かを行うことができます。

public void Save(UserViewModel uv) 
{ 
    // this throws error: cannot convert from UserViewModel to Entity.User 
    var config = new MapperConfiguration(cfg => { 

       cfg.CreateMap<UserViewModel , User>(); 

      }); 
    User u = config.CreateMapper().Map<User>(uv); 
    MyRepository.UpdateUser(u); 
} 

、または手動:

public void Save(UserViewModel uv) 
{ 
    User u = new User() 
     { 
     Id = uv.Id 
     Name = uv.Name; 
     Address = uv.Address; 
     }; 
    MyRepository.UpdateUser(u); 
} 

ビューモデルとモデルを変更してコードを変更する必要がある場合は手動で行うのは適切ではありませんが、Automapperではneコードを変更します。

EDIT1:

これはリポジトリ(DATAACCESSコア)にモデル・ビューを使用するのは良い考えではありませんので、あなたのpublic void UpdateUser(User u)を維持する方が良いだろうし、それを変更しない、外にそれはに優れていますuserUpdateUserではなく、UserViewModelとしてください。

EDIT2:私はUserViewModelを通過したとき答えポストの私の意見を非で

は、SOC(懸念の分離)に関連していなくても、鉱山...

1 - 私は、これを侵してきましたSOC ....

2-私はもう一度、私はまた、SOCに違反したユーザー層の中に表示されます。

私は

プレゼンテーション< ---->プロキシ< ---->リポジトリ....最良の方法は、プロキシなどの中間層であると思います。

1

あなたのリポジトリ内の(ビューモデル - > enityモデル)UpdateUserメソッドをプロパティ値のマッピングを行っています。そのため、ビュー・モデル・クラス(UserViewModel)をそのパラメータ・タイプとして使用します。

public void UpdateUser(UserViewModel u) 
{   
    // Get the entity first 
    var user = GetUserDetails(u.Id); 

    // Read the property values of view model object and assign to entity object 
    user.Name = u.Name; 
    user.Address = u.Address; 

    //using entity framework to save 
    _context.SaveChanges(); 
} 

Saveメソッドから、このメソッドにビューモデルオブジェクトを渡すことができます。

これは、質問のあなたの現在の問題であるあなたのコンパイル時エラー()を修正しますが、どのレイヤーでどのレイヤーを使用しているのか注意してください。データアクセスレイヤーでビューモデルクラスを使用することを心配する人は、中間のサービスレイヤーで行うことができます。しかし、そのレイヤーでエンティティモデルを取得してそこで更新を行っています。

はその質問のための明確な答えはありません、覚えておいてください。 プロジェクト/チームとの一貫性と読みやすいアプローチを使用してください。多くの場合、私は "View models"より "Common DTO classes"という言葉を使う傾向があります。そのため、私は平和的に別の層にそれらを渡すことができます。私はそれらを別のプロジェクト(Common DTOと呼ばれています)に保管しています。これは他のプロジェクトを横断して行われます。つまり、Web/UIレイヤーとデータアクセス/サービスレイヤーにこのCommon DTOプロジェクトへの参照を追加し、必要に応じてそれらを使用します。

+0

UpdateUserメソッドはmuデータプロジェクトの一部であるリポジトリクラスにあり、UserViewModelはWebプロジェクトの一部です。私はこれがあなたが言及した正しい方法だとは思わない。 – aman

+0

はい。それであなたはあなた自身を作る必要があります。どの層がどの層まで行くか(この質問については明確な答えはありません)。私の答えはあなたの現在のコンパイル時のエラーを解決することです。どのクラスをどのレイヤにするかは、あなた次第です。しばしば、私はビューモデルの代わりにクラス共通DTOを呼び出し、深いレイヤーに渡すことができます。 – Shyju

+0

私はこれらの共通のDTOクラスを別々のDTOプロジェクトに移し、それをWebプロジェクトとデータアクセスプロジェクトの両方で参照する傾向があります。 – Shyju

1

タイプUserのオブジェクトとリポジトリの取引は、あなたが戻って、その型のインスタンスに値をマッピングしてから呼び出しを行う必要があります。

public void Save(UserViewModel uv) 
{ 
    var user = MyRepository.GetUser(uv.Id); 
    user.Name = uv.Name; 
    user.Address = uv.Address; 
    MyRepository.UpdateUser(user); 
} 

あなたは、あなたのリポジトリクラスの変更を保存することができます:あなたはGetUserというユーザーを取得するためのメソッドを持っていると仮定すると

。あなたは、オブジェクトが別のコンテキストで作成された場合、問題がないことを確認するために、オブジェクトを添付することができます。

public void UpdateUser(User u) 
{  
    _context.Users.Attach(u); 
    _context.Entry(u).State = EntityState.Modified; 
    _context.SaveChanges(); 
} 
+0

'User'は、' UserViewModel 'として渡すことができる間に 'Save'で取得する必要があります。 – Aria

+0

@Aria:' UserViewModel'クラスは、プレゼンテーションレイヤー。リポジトリには、ユーザーのビューについての知識はありません。関心事の分離。 – JuanR

+0

はいSOCによると、リポジトリはプレゼンテーション層について知りません。もし彼が 'UserViewModel'の代わりにIdを使ったなら、あなたの文章とコードはもっと近くなります。 – Aria

関連する問題