2016-05-14 60 views
0

按照给定的资料库界面: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,但我意识到这是不可能的,因为我可以得到它发生在另一种方法IdSaveChanges()后只。

我觉得这是没有意义的调用SaveChanges()Add()方法,因为在现实生活中的例子库中含有较多的方法,例如Edit(),然后我的一些方法会而其他不叫Save()自己?听起来对我来说不是一个好主意。

什么是一个优雅的方式来实现我所需要的?

回答

0

好吧比我想象的要容易得多,如果使用Entity Framework 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); 

如果你的IDS也是GUID或某种自定义字符串的,事情变得越来越复杂将布尔标志添加到每个实体可能是最舒服的,标记它是否是最新的。