使用给定的存储库接口:
public ConcreteRepository : IRepository<Something>
{
void Add(Something entity)
{
_context.Somethings.Add(entity);
}
void Save()
{
_context.SaveChanges();
}
}
让我们说具体的存储库:
Id
我必须将entity.Id
最新项目插入数据库。我需要这个,因为在用户发布表单后我的应用程序中我想将他重定向到新创建的项目。
我的第一个想法是简单地从Add(T entity)
方法返回Id
,但我意识到这是不可能的,因为我只能在SaveChanges()
之后才能获得SaveChanges()
另一种方法。
我认为在我的Add()
方法中调用Edit()
是没有意义的,因为在现实生活中,示例存储库包含更多方法,例如Save()
,然后我的一些方法会调用if let views = superview?.subviews
{
for aView in views
{
if let fancyView = aView as? Fancy
{
fancyView.someProperty = 7
fancyView.someCall()
}
}
}
他们自己而其他人没有?对我来说听起来不是一个好主意。
实现我需要的优雅方式是什么?
答案 0 :(得分: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 = "anotheruser@gmail.com",
Registered = DateTime.UtcNow
};
_repository.Add(obj);
_repository.Save();
int id = obj.Id;
}
答案 1 :(得分:0)
我想说这很大程度上取决于您的实体ID是如何表示的。 如果你的id是简单的顺序递增整数,那么将最新项插入到列中就像下面的linq查询一样简单:
var latestId = _.context.Somethings.Where(x => x.user == userId).Max(x => x.Id);
如果您的ID是Guids或某种自定义字符串,事情变得越来越复杂,向每个实体添加布尔标志可能是最舒服的,标记它是否是最新的。