Называть stored procedure с Энтити Фрамеворк

Я использую stored procedure, SQL Server, EF (code first). У меня есть stored procedure, созданный в базе данных и я хочу назвать это с моего кода.

Stored procedure:

CREATE PROCEDURE uspCreateLocal
-- Add the parameters for the stored procedure here
@Direccion varchar(100),
@Nombre varchar(80),
@Fijo varchar(9),
@Celular varchar(9),
@Administrador int

AS

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTO Locales (Direccion, Nombre, Fijo, Celular, Administrador) 
    VALUES(@Direccion, @Nombre, @Fijo, @Celular, @Administrador)
SELECT SCOPE_IDENTITY() AS  LocalId 
END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
GO

С моего кода я хочу назвать это

public void InsertOrUpdate(Local entity)
    {
        using (var context = new PosContext())
        {
            if (entity.LocalId == default(int))
            {
                bool exist = Exist(o => o.Nombre == entity.Nombre);
                if(exist)
                    throw new ArgumentException("El Local, que intenta registrar ya existe.");
                else
                {
                    context.Locales.Add(entity);
                    context.SaveChanges();
                }
            }
            else
            {
                context.Entry(entity).State = EntityState.Modified;
                context.SaveChanges();
            }
        }
    }

Я буду заменять часть Add store. Как я должен называть это и посылать ему параметры?

Я делаю это следующим способом:

public void InsertOrUpdate(Local entity)
    {
        using (var context = new PosContext())
        {
            if (entity.LocalId == default(int))
            {
                bool exist = Exist(o => o.Nombre == entity.Nombre);
                if(exist)
                    throw new ArgumentException("El Local, que intenta registrar ya existe.");
                else
                {
                    //context.Locales.Add(entity);
                    //context.SaveChanges();
                    DbModelBuilder modelBuilder = new DbModelBuilder();
                    modelBuilder.Entity<Local>()
                        .MapToStoredProcedures(s =>
                        s.Insert(i => i.HasName("uspCreateLocal")
                        .Parameter(b => b.Direccion, "Direccion")
                        .Parameter(b => b.Nombre, "Nombre")
                        .Parameter(b => b.Fijo, "Fijo")
                        .Parameter(b => b.Celular, "Celular")
                        .Parameter(b => b.Administrador, "Administrador")));
                    context.SaveChanges();
                }
            }
            else
            {
                context.Entry(entity).State = EntityState.Modified;
                context.SaveChanges();
            }

Мне не удается сохранять в db новый реестр, потому что он вне контекста. Как я могу решать это?

3
задан 07.01.2017, 23:03
0 ответов

Когда он коснулся мне выполнять процедуры, хранившиеся с Энтити Фрамеворк, я это сделал используя context.Database.ExecuteSqlCommand(). В твоем случае, было бы видно нечто похожее:

context.Database.ExecuteSqlCommand(
    "exec uspCreateLocal @Direccion, @Nombre, @Fijo, @Celular, @Administrador",
    new SqlParameter("@Direccion", entity.Direccion),
    new SqlParameter("@Nombre", entity.Nombre),
    new SqlParameter("@Fijo", entity.Fijo),
    new SqlParameter("@Celular", entity.Celular),
    new SqlParameter("@Administrador", entity.Administrador));

Добавочный комментарий:

Не импортируя формы, как ты выполнил хранившуюся процедуру, потому что не говорится о EF entity, выполнение применяется сразу к базе данных. Нет необходимости звонить SaveChanges() поскольку делаются с общепринятыми изменениями entities.

2
ответ дан 03.12.2019, 17:50
  • 1
    что alegrí которому ты отвечал, был часы пытаясь уже habí в факт похожий один, но это не был правильный, я функционирую превосходно, это пример образца я могу перемещать index store отношусь к stor, у которых есть несколько operacones внутри, возможно делать, если бы estubieran введенные несколько организаций (подмостки) он сделал класс где pondrí в свойства введенных организаций –  07.01.2017, 22:34
  • 2
    хороший, если она была связана мои организации и в этом случае está n из-за судоходности deberí когда мне показывают другие свойства других связанных организаций –  07.01.2017, 22:40

Это форма, как я называю их, имейте в виду, что Dbset характерный в его случае, будь должен называть это для специфического dbset, который такой, как обычно используют, возврати queries в Dictionary

  using System.Threading.Tasks;
  using MySql.Data.Entity;
  using System.Data.Common;
  using System.Data.Entity;
  using DbManager.Mensajeria;
  using DbManager.Shared;
  using ClassLibraryLog;
  using System.Data.Entity.Core.Objects;
  using System.Data.Entity.Infrastructure;
  using System.Data;
  using System.Data.SqlClient;
  using System.Collections;
  using System.Reflection;

  namespace DbManager
  {
   public class DbManager<T> : DbContext where T : class
  {
    public DbSet<T> listItems { get; set; }
    //private object objType;

    public DbManager(string context) : base(context)
    {
        Database.SetInitializer<DbManager<T>>(null);
    }

  public virtual Dictionary<string, object> ExecuteStoreProcedureWithResultDictionary(string NameStoreProcedure, Dictionary<string, object> Parameters)
    {
        Dictionary<string, object> Values = new Dictionary<string, object>();

        try
        {
            var cmd = Database.Connection.CreateCommand();
            cmd.CommandText = NameStoreProcedure;
            Database.Connection.Open();
            foreach (KeyValuePair<string, object> x in Parameters)
            {

                var param = cmd.CreateParameter();
                param.ParameterName = string.Format("@{0}", x.Key);
                param.Value = x.Value;
                cmd.Parameters.Add(param);

            }
            cmd.CommandType = CommandType.StoredProcedure;
            var reader = cmd.ExecuteReader();

            do
            {
                try
                {
                    //  values = ((IObjectContextAdapter)this).ObjectContext.Translate<T>(reader, "listItems", MergeOption.AppendOnly).ToList();
                    bool findValues = false;

                    while (reader.Read())
                    {
                        T data = Activator.CreateInstance<T>();
                        data.GetType().GetProperties().ToList().ForEach(x =>
                        {
                            if (!x.GetMethod.IsVirtual)
                            {
                                if (reader.GetOrdinal(x.Name) >= 0)
                                {
                                    object value = reader.GetValue(reader.GetOrdinal(x.Name));
                                    Values.Add(x.Name, value);
                                    findValues = true;
                                    //  values.Add(data);
                                }
                            }

                        });
                    }
                    if(findValues)
                        break;
                    // reader.

                }
                catch (Exception e)
                {
                    ClassLogger.LogMsg(LogLevel.ERROR, this.GetType().Name, MethodBase.GetCurrentMethod().Name, e.ToString(), true);
                    return null;
                }

            } while (reader.NextResult());


        }
        catch (Exception e)
        {
            ClassLogger.LogMsg(LogLevel.ERROR, this.GetType().Name, MethodBase.GetCurrentMethod().Name, e.ToString(), true);
            return null;
        }
        return Values;

    }
}
3
ответ дан 03.12.2019, 17:50
  • 1
    Меня не убеждает форма, как ты это осуществляешь –  07.01.2017, 21:08
  • 2
    @Pedro Авила несколько вещей первая состоит в том, что не является очень конструктивным комментарий относительно убедительного, который или нет, другой состоит в том, что, как я это сказал в ответе, этот для характерного dbset, так как намерение состояло в том, чтобы консультировать любой тип данных и мочь возвращать это исходя из любого типа параметра, уже, если он нуждается в том, чтобы соединить это в специфический класс –  07.01.2017, 21:18
  • 3
    @PedroÁ vila, чтобы стараться выполнять store на специфическом объекте, он может стараться использовать ((IObjectContextAdapter) this).ObjectContext. Translate< T> (reader, " listItems" MergeOption. AppendOnly).ToList (), но ud он был бы должен знать, что он возвращает store, и что он равнялся entity –  07.01.2017, 21:59
  • 4
    я буду изменять вопрос –  07.01.2017, 22:12