我有 E.F的 ASP.NET MVC 5 网络项目。 6.1.3。 我使用 IDbSet 及其方法添加在我的数据库中插入新数据。我还使用上下文来保存更改。
protected IDbSet<T> DbSet { get; set; }
public DbContext Context { get; set; }
private void Insert(T item)
{
this.DbSet.Add(item);
Context.SaveChanges();
}
当我在数据库中插入新的项目时 在此接口中是否有任何等效方式到Sql Command.ExecuteScalar ? 换句话说,我需要获取新插入项目的Id (我的Id是当前表格中的第一列和第一行)。
答案 0 :(得分:1)
你不需要ExecuteScalar(但是你必须通过 不,你没必要,它没有代理)context.Set<T>().Create()
方法创建你的POCO
class MyPoco
{
[Key]
public int Id {get;set;}
}
...
var myPoco = context.Set<MyPoco>().Add(context.Set<MyPoco>().Create());
context.SaveChanges();
int newId = myPoco.Id;
但是,如果你必须有一些直接商店查询,你可以使用context.ExecuteStoreQuery(它不在IDbSet上,但在Context类上)
var departments = context.ExecuteStoreQuery<string>
("select Name from Department where DepartmentID < @p0", 5);
编辑 (在您添加代码之后:)):
您可以使用Id属性将自定义界面(甚至基类)添加到您的POCO:
public interface IId
{
int Id {get;}
}
class MyPoco
: IId
{
[Key]
public int Id {get;set;}
}
并更新您的插入代码,如下所示:
private int Insert(T item)
where T : IId
{
this.DbSet.Add(item);
Context.SaveChanges();
return item.Id;
}
请注意,当您通过 工作。 poco = new Poco()
创建POCO时,这不起作用 - 这样,您放弃了很多EF功能(代理),您必须使用IDbSet<T>.Create()
方法)
或者在将item
发送到Insert(item)
后保留var myPoco = context.Set<MyPoco>().Add(context.Set<MyPoco>().Create());
context.Insert(myPoco);
int newId = myPoco.Id;
并获取身份证值:
row_limiting_clause