2016-06-12 1 views
0

삭제 작업을 수행하는 데 문제가 있습니다. 음, 실제로 제거하는 것이 아니라 상태를 변경하는 중입니다.ObjectStateManager에서 해당 객체를 찾을 수 없으므로 객체를 삭제할 수 없습니다. Entity Framwork 및 저장 프로 시저를 사용하여

내가 삭제 또는 변경 상태로 저장 프로 시저를 사용하고

ALTER PROCEDURE [dbo].[Delete_Empresa] 
    @CveEmpresaPK int = NULL, 
    @Estatus bit = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    if @Estatus = 0 
    begin 
     update CatEmpresas 
     set Estatus = 'False' 
     where CveEmpresaPK = @CveEmpresaPK 
    end 
    else 
    begin 
     update CatEmpresas 
     set Estatus = 'True' 
     where CveEmpresaPK = @CveEmpresaPK 
    end 
END 

나는 "할당 저장 프로 시저"

enter image description here

내 테이블에 내 SP를 추가하고 내 저장 프로 시저입니다 엔티티 프레임 워크 내 테이블에 매핑하기

C#의 방법은 (클래스 BaseRepository.cs) : 난 단지 두 개의 데이터

내 저장소를 사용

public void Detele(TEntity entity) 
{ 
     try 
     { 
      using (_context) 
      { 
       _context.Set<TEntity>().Remove(entity); 
       _context.SaveChanges(); 
      } 
     } 
     catch (DbEntityValidationException e) 
     { 
      foreach (var eve in e.EntityValidationErrors) 
      { 
       Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
        eve.Entry.Entity.GetType().Name, eve.Entry.State); 

       foreach (var ve in eve.ValidationErrors) 
       { 
        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
         ve.PropertyName, ve.ErrorMessage); 
       } 
      } 
      throw; 
     } 
} 

때 호출 BaseRepository.cs :

public class CatEmpresas_Repositorio : Base.BaseRepository<CatEmpresa>, Interfaces.ICatEmpresas 
{ 
    private DBControlCalidadEntities _context = null; 

    /// <summary> 
    /// Iniciamos una instancia con una clase generica para Create, Update y Detele 
    /// </summary> 
    public CatEmpresas_Repositorio() 
     : base(new DBControlCalidadEntities()) 
    { 
    } 

및 본인 :

namespace SistemaControl_Entidades { 

public partial class CatEmpresa 
{ 
    public CatEmpresa() 
    { 
     this.CatPersonals = new HashSet<CatPersonal>(); 
     this.Cve1NivelDepto = new HashSet<Cve1NivelDepto>(); 
    } 

---->public int CveEmpresaPK { get; set; } 
    public string NombreEmpresa { get; set; } 
    public string RazonSocial { get; set; } 
    public string RFC { get; set; } 
    public string TipoEmpresa { get; set; } 
    public string Direccion { get; set; } 
    public string Colonia { get; set; } 
    public string CodigoPostal { get; set; } 
    public Nullable<int> CveEstadoFK { get; set; } 
    public Nullable<int> CveMpioFK { get; set; } 
    ----->public Nullable<bool> Estatus { get; set; }...... 

도와주세요, 어떻게됩니까?

+0

을 당신의 맥락에서 그렇습니다. 비록 IQueryable 에서 파생되었지만이 세트에서 직접 제거를 호출하는 것은 아닙니다 (EF가 검색 + 삭제 호출로 변환 할 수 있을지 의심 스럽습니다). 컨텍스트에서 데이터를 수집 한 다음 EntityState를 삭제하도록 설정하십시오. 또한 전역 컨텍스트에서 using() 문을 사용하면 오류가 발생할 수 있습니다 (Dispose()가 블록을 떠날 때 호출되기 때문에). – DevilSuichiro

+0

코드에서 Delete_Empresa SP를 호출하는 곳은 어디입니까? 나는 그것을 보지 않는다. 또한 Entity Framework 코드를 먼저 사용하고 있습니까? – jpgrassi

+0

sproc을 어떻게 삭제 작업에 매핑했는지 보여주십시오. 나는 두 번째 매개 변수'@ Estatus'가 여기서 잘 작동하지 않는다고 생각한다. –

답변

0

당신은 당신이 원하는 것을 달성하고 또한 사용자의 컨텍스트에서 직접 SP를 호출하여 "배제"에 대한 그들을 위해 표시하기 전에 모든 개체를 검색 할 필요가 피할 수 있습니다 : 당신의 설정 이 모든 요소를 ​​포함

using (_context) 
{ 
    string stpSQL = @"EXEC [dbo].[Delete_Empresa] @CveEmpresaPK, @Estatus"; 

    context.Database.ExecuteSqlCommand(TransactionalBehavior.EnsureTransaction, stpSQL, 
     new SqlParameter("@CveEmpresaPK", entity.CveEmpresaPK), 
     new SqlParameter("@Estatus", entity.Estatus)); 
} 
+0

나는 내 테이블의 엔티티를 사용하고 있습니다. SP는 삭제 기능, 테이블 만들기 및 업데이트 (EF 및 SP와의 CRUD)와 같은 테이블을 사용하여 내 EF 모델에서 매핑합니다. 생성 및 업데이트 할 수 있었지만 삭제할 수 없습니다. –