2016-05-14 40 views
0

のIDを取得:ASP.NET MVC、与えられたリポジトリインターフェイスでは、最新の追加アイテム

public interface IRepository<T> where T : class 
{ 
    void Add(T entity); 
    void Save(); 
} 

との、具体的なリポジトリとしましょう:

public ConcreteRepository : IRepository<Something> 
{ 
    void Add(Something entity) 
    { 
     _context.Somethings.Add(entity); 
    } 
    void Save() 
    { 
     _context.SaveChanges(); 
    } 
} 

を、私は、最新のアイテムのIdを取得する必要がありますデータベースに挿入されます。私はそれが必要です。なぜならユーザーがフォームを投稿した後に私のアプリで新しく作成したアイテムにリダイレクトしたいからです。

私が最初に考えたのは、単にAdd(T entity)方法からentity.Idを返すことでしたが、私は唯一の別の方法で行わSaveChanges()Idを得ることができますので、私は、それは不可能です実現しました。

私は、実際の生活の例では、リポジトリは、たとえばEdit()のために、より多くのメソッドが含まれており、他のではないながら、私の方法のいくつかは、自分でSave()を呼び出しますので、これは私のAdd()方法でSaveChanges()を呼び出すためにも意味がありませんと思いますか?私にはいいアイデアのようには聞こえません。

私が必要とするものを達成するためのエレガントな方法は何でしょうか?

答えて

0

エンティティフレームワーク6を使用していると思ったよりもはるかに簡単です。エンティティフレームワークは、データベースにコミットされた後、元のオブジェクトをIDで更新します。例モデル

public class User 
{ 
    public int Id { get; set; } 
    public string Email { get; set; } 
    public DateTime Registered { get; set; } 
} 

例コールリポジトリの

public AddSomethingToDatabase() 
{ 
    User user = new User 
     { 
      Email = "[email protected]", 
      Registered = DateTime.UtcNow 
     }; 

    _repository.Add(obj); 
    _repository.Save(); 

    int id = obj.Id; 
} 
0

私はそれが大幅にあなたの実体Idが表現されているかに依存していることだと思います。 あなたのIDは、単純なsequentialy増加の整数である場合は、列に挿入、最新のアイテムを取得すると、次のLINQクエリのと同じくらい簡単です:

var latestId = _.context.Somethings.Where(x => x.user == userId).Max(x => x.Id); 

あなたのIDは、GUIDのか、カスタム文字列のいくつかの種類であれば、物事はより複雑になっていますそれぞれのエンティティにブール値フラグを追加して最新かどうかをマークするのが最も快適です。

関連する問題