如何使用E.F. IDbSet <t>返回值

时间:2015-07-04 17:22:33

标签: asp.net-mvc c#-4.0 entity-framework-6

我有 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是当前表格中的第一列和第一行)。

1 个答案:

答案 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