EntityFramework6 연구 노트 (다)

당신은 내가 그것을 피하기 위해 쓰기 SQL에 EF를 사용하지 않는 질문 할 수 있습니다? 그렇지 않으면 좋은 나는 직접 ADO.NET SQL을 작성했다한다. 그럼에도 불구하고, 당신이 그래, 당신은 가끔 EF를 운영 데이터를 사용할 수있는 말, 갈 수있는 일반 프로세스에 따라, 약간의 불편은, 예를 들어, 당신은 조건에 따라 레코드 그룹을 삭제 할 수있다, 당신은 이러한 데이터 밖으로 먼저 확인해야하고, 다음 그들에게 그렇게 만 번잡하지 하나씩 삭제뿐만 아니라 성능은 상대적으로 낮다. 이 경우 SQL은 전원을 표시됩니다.

EF의 사용은 특히 쿼리의 구현에, EF는 DataReader를 문제를 사용 할 필요가 없습니다, 데이터가 자동으로 데이터 엔티티에 저장됩니다 쿼리합니다, SQL 편리 ADO.NET을 능가 실행합니다. 쿼리의 값을 변경하면 한편, 데이터를 추적 할 수 체크 아웃, 당신은 쉽게 데이터베이스에 직접 업데이트) (.SaveChanges를 사용할 수 있습니다.

ExecuteSqlCommand 与은 SQLQuery

데이터베이스가 속성 데이터 컨텍스트 DBModel 예제되는 .ExecuteSqlCommand () 및 .SqlQuery () 두 가지 방법이있다. .ExecuteSqlCommand ()를 생성, 갱신 및 삭제 작업에 더 적합합니다, 그래서 그들은 SQL 문을 실행할 수 있지만, .ExecuteSqlCommand은 () 결과를 반환하지 않습니다 만, 영향을받는 행의 수를 반환합니다. .SqlQuery ()는이 조회 작업을 수행하기에 더 적합 쿼리에 결과를 반환하고, 그 결과를 데이터 엔티티에 저장된다.

사용 .ExecuteSqlCommand ()를 작성, 업데이트 실행, 삭제

이행의 완료가 영향을받는 행의 수를 반환합니다 후 .ExecuteSqlCommand () 메소드는, 직접의 SQL 문으로도 사용이 매우 간단합니다.

사용 (var에 DB는 새로운 DBModel을 (= )) // 데이터베이스 컨텍스트 만들기 
{ 
    // 동기화 SQL을 수행하는 방식으로, 행 수에 영향을 반환 
    INT 결과 = db.Database.ExecuteSqlCommand을 (@ "CREATE TABLE` test`.`test을 `( 
                 `NOT NULL, id` INT 
                 기본 키 (`id`)); "); 

    피하기 SQL 주입에 // 사용 SqlParameter에 패스 값 
    var에 p_name = 새로운 SqlParameter에 ("@ 이름 "," 로리 "); 
    var에 p_age SqlParameter에 새로운 새 = ( "나이 @", 13 인); 

    // 당신이 MySqlParameter의 SqlParameter에 교체 MySQL 데이터베이스가 필요 사용하는 경우 
    MySqlParameter 새로운 새 = ( "이름 @", "로리")의 // var에 p_name; 
    // = var에 p_age을 MySqlParameter 새 새 (13, "나이 @"); 

    // 학생들의 나이를 변경 
    결과 = db.Database.ExecuteSqlCommand (@ "UPDATE`의 test`.`student` test`을.`student` 
                                           SET`age` = @age
                                           = 'Name` @name; "p_age, p_name는) 

    // 비동기 SQL를 실행하고 리턴 행수 영향 
    작업 <INT> result2 = db.Database.ExecuteSqlCommandAsync ( "DROP TABLE`의 test`.`을 test`; "); 
}

  PS : 현재 데이터베이스를 만들거나 삭제해야하는 경우, 인수를 취하지 않는 및 부울을 반환 데이터베이스 속성이 .Create ()와 .Delete () 메소드는, 성공 또는 실패를 나타내는.

사용 .SqlQuery () 쿼리 데이터

.SqlQuery을 보는 이름에서 () 쿼리를 실행하는 데 사용됩니다. 사용하기 전에 .SqlQuery는 (), 반환 값의 데이터 유형을 지정, 예를 들어, 내가 완전한 정보 조회에게 학생을 찾아, 당신은 학생 유형의 유형을 지정할 수 있습니다. 통계는 학생 수있는 경우, 반환 값은 세트 INT 관련하여, 정수입니다.

참고 : 수의뿐만 아니라 반환 값은 수신 속성 값의 수에 동일한 유형이어야하며, 이름이 동일하거나 잘못된해야합니다. 난 그냥 이름과 나이를 얻고 싶은 경우에 따라서, 데이터를 저장, 하나의 클래스 (이름과 int 형 시대의 유형을 포함하는 문자열)를 정의해야합니다.

TEMP 클래스 
{ 
    공공 문자열 이름 {GET, SET;} 

    공공 INT 나이 {GET, SET;} 
} 

메인 (문자열 []에 args) 무효 정적 
{ 
    사용 (var에 새로운 새로운 DBModel DB를 = ()) // 데이터베이스 컨텍스트를 만들기 
    { 
        // 쿼리 학생 정보 전화 로리타 및 지정 반환 형식 학생 
        DbRawSqlQuery <학생> 결과 1 = db.Database.SqlQuery <학생> (이하 "SELECT * test.student 이름 = '로리타' 'FROM); 
        //도 반환 값의 유형을 지정할 수 
        // DbRawSqlQuery 결과 1 = db.Database.SqlQuery (대해서 typeof ( 학생), "test.student SELECT * FROM WHERE 이름 = ' 로리'"); 
        . Console.WriteLine (result1.FirstOrDefault () 이름 ); // 인쇄 이름 
 
        DbRawSqlQuery <INT> result2 = db.Database.SqlQuery < INT> ( ") "test.student FROM SELECT COUNT (*);
        Console.WriteLine (result2.FirstOrDefault ()); // 학생들의 수 인쇄 

        // 쿼리에만 학생의 나이와 이름을
        VAR result3 = db.Database.SqlQuery <온도> ( "SELECT name```test.student FROM age`]"); 
        foreach는 (result3에서 임시 항목) 
        { 
            Console.WriteLine (item.name + ":"+ item.age을); 
        } 
    }

  

.SqlQuery에서 사용 DbSet <T> ()

전술 한 바와 같이 .SqlQuery () 함수 및, 데이터, .SqlQuery하지만 DbSet 각각 엔티티 DbSet <T> 컬렉션이있다 <T>에서 () 유형을 리턴 할 수 DbSet <T>입니다. 그러나 DbSet <T는> .SqlQuery에 ()) 데이터베이스 컨텍스트 (DBModel가), 반환 된 데이터의 상태를 추적하기 위해 반환 된 데이터의 변경이 발생하는 경우, 당신은 .SaveChanges을 (사용할 수 있도록하는 동시에 데이터를 반환합니다 직접 결과를 다시 저장합니다 데이터베이스. .Database.SqlQuery 결과는 () 불가능 격리됩니다.

사용 (var에 DB는 새로운 DBModel을 (= )) // 데이터베이스 컨텍스트 만들기 
{ 
//라는 로리타 학생 정보 쿼리를 그녀의 나이 수정 
"(학생 결과 1 = db.students.SqlQuery을 SELECT * WHERE 이름 test.student FROM = '로리' ') .FirstOrDefault (); 
result1.age = 13이다 .SqlQuery 데이터 엔티티의 다음 세트에 의해 조회 // 후 변형의 데이터베이스에 저장 될 수 

학생 result2 = db.Database.SqlQuery <학생> ( "SELECT * test.student 어디에서 이름 = ' 카이'") .FirstOrDefault (); 
result2.age = 21; // 그래서 여기에 수정, .Database.SqlQuery이 쿼리를 사용하는 데이터베이스에 저장되지 않기 때문에 

// 만약이 고립 .Database.SqlQuery 데이터베이스에 데이터를 저장할 수 있습니다 수정 원하는 
학생 result3 = db.Database.SqlQuery <학생> ( "SELECT * test.student FROM WHERE 이름 = ' 밥'") .FirstOrDefault (); 
result3.age = 36; 
db.Entry <학생> (result3) .STATE = System.Data.Entity.EntityState.Modified;
// 통지 데이터 컨텍스트이 레코드는 수정 
) (db.SaveChanges 단계;
}

  

 

추천

출처www.cnblogs.com/ning123/p/11866883.html