首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从EF6.0代码中调用存储过程不首先插入记录

从EF6.0代码中调用存储过程不首先插入记录
EN

Stack Overflow用户
提问于 2014-02-27 00:20:16
回答 1查看 1.2K关注 0票数 1

我是EF的新手,正在玩这个游戏。当我试图从存储库调用在数据库中创建的存储过程时,我陷入了困境。我运行Server事件探查器,存储过程不被执行。谁能给我指出正确的方向吗?

我使用VS 2012和Server 2008 R2。我在服务层中使用工作单元存储库模式,并在Uow上调用Uow(如果遵循这种方法,我不确定是否必须调用commit,因为文档说数据库上下文从未跟踪该查询的结果)。

任何帮助都是非常感谢的。

到目前为止,我已经做了一些事情。在存储的proc名称前面使用或不使用Exec关键字

我的存储库代码:

代码语言:javascript
复制
public class CarRentalUserRepository :  RepositoryBase<CarRentalUser>
{
    public override void Add(CarRentalUser user)
    {
       using (var cxt = this.DataContext)
       {
           var userId = new SqlParameter { ParameterName = "@UserId", Value = 0, Direction = System.Data.ParameterDirection.Output };
           var roleId = new SqlParameter("@RoleId", user.RoleId);
           var firstName = new SqlParameter("@FirstName", user.FirstName);
           var lastName = new SqlParameter("@LastName", user.LastName);
           var email = new SqlParameter("@EmailAddress", user.EmailAddress);
           var passsword = new SqlParameter("@Password", user.Password);
           var active = new SqlParameter("@IsActive", user.IsActive);

           //I see for some reason,the connection state is closed.So am opening that connection here(Don't know why)
           if (cxt.Database.Connection.State == System.Data.ConnectionState.Closed)
           {
              cxt.Database.Connection.Open();
           }

           var result =  cxt.Database.SqlQuery<CarRentalUser>(" exec CarRental_InsertUser @UserId, @RoleId, @FirstName, @LastName, @EmailAddress, @Password, @IsActive", userId, roleId, firstName, lastName, email, passsword, active);

           if (result != null)
           { 
           }
        }
    }

public class RepositoryBase<T> where T : class
{
    private CarRentalDbContext _dbcontext = null;
    private readonly IDbSet<T> dbset;

    public RepositoryBase(IDatabaseFactory databseFactory)
    {
       //DatabaseFactory = databseFactory;
       this.DataContext = databseFactory.DbContext;
       dbset = DataContext.Set<T>();
    }

    //protected IDatabaseFactory DatabaseFactory { get;private set; }
    protected CarRentalDbContext DataContext
    {
       get { return _dbcontext; }
       set { _dbcontext = value; }
    }

    public virtual void Add(T entity)
    {
       dbset.Add(entity);
    }

    public virtual void Update(T entity)
    {
       dbset.Attach(entity);
       DataContext.Entry(entity).State = EntityState.Modified;
    }

    public virtual void Delete(T entity)
    {
       dbset.Remove(entity);
    }

    public virtual void Delete(Expression<Func<T, bool>> predicate)
    {
       IEnumerable<T> objects = dbset.Where<T>(predicate).AsEnumerable();
       if (objects != null && objects.Any())
       {
           foreach (T obj in objects)
           {
               dbset.Remove(obj);
           }
       }
    }

    public virtual T GetById(long Id)
    {
       return dbset.Find(Id);
    }

    public virtual T GetById(string Id)
    {
       return dbset.Find(Id);
    }

    public virtual T Get(Expression<Func<T,bool>> predicate)
    {
       return dbset.Where(predicate).FirstOrDefault<T>();
    }

    public virtual IEnumerable<T> GetAll()
    {
       return dbset.ToList();
    }

    public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> predicate)
    {
       return dbset.Where(predicate).AsEnumerable<T>();
    }
}

public class UnitOfWork : IUnitOfWork
{
    //private readonly IDatabaseFactory databaseFactory;
    private CarRentalDbContext _dbContext;

    public UnitOfWork(IDatabaseFactory databaseFactory)
    {
        this.DataContext = databaseFactory.DbContext;
    }

    public void Commit()
    {
        if (DataContext != null)
        {
            DataContext.Commit();
        }
    }

    public CarRentalDbContext DataContext
    {
        get { return _dbContext; }
        set { _dbContext = value; }
    }
}

public interface IUnitOfWork
{
   void Commit();
}

public class CarRentalDbContext : DbContext
{
    public CarRentalDbContext()
        : base("CarRental_Connection_String")
    {
        var ensureDLLIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        Database.SetInitializer<CarRentalDbContext>(null);
    }        

    public DbSet<CarRentalUser> Users { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Configurations.Add(new CarRentalUserMap());
        modelBuilder.Configurations.Add(new CarRentalRoleMap());
    }
}

和我的存储过程

代码语言:javascript
复制
Create PROCEDURE dbo.CarRental_InsertUser (
    @UserId INT OUTPUT
    ,@RoleId INT
    ,@FirstName VARCHAR(50)
    ,@LastName VARCHAR(50)
    ,@EmailAddress VARCHAR(25)
    ,@Password VARBINARY(500)
    ,@IsActive BIT
    )
AS
BEGIN
    INSERT INTO [CarRental].[dbo].[CarRentalUser]
           ([RoleId]
           ,[EmailAddress]
           ,[FirstName]
           ,[LastName]
           ,[Password]
           ,[CreatedDtm]
           ,[UpdateDtm]
           ,[IsActive])
     VALUES
           (
               @RoleId,
               @EmailAddress,
               @FirstName,
               @LastName,
               @Password,
               GETDATE(),
               null,
               1           
           )

    set @UserId = SCOPE_IDENTITY();
END
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-27 15:05:29

我想我解决了这个问题,我对我打DB电话的部分做了如下修改

代码语言:javascript
复制
var result =  cxt.Database.SqlQuery<int>("CarRental_InsertUser @UserId,@RoleId,@FirstName,@LastName,@EmailAddress,@Password,@IsActive",
                                                                         userId,roleId,firstName,lastName,email,passsword,active);

                   if (result != null)
                   {
                       retVal = result.Single();
                   }

由于我的存储过程返回一个int输出parameter.Also,我注意到一件事是,这个过程只有在我调用result.Single()之后才会被执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22056490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档