2011-01-30 6 views
111

EF Code First의 여러 프레젠테이션을 보았으며 EFCF가 저장 프로 시저와 함께 작동하는 방식을 보지 못했습니다.Entity Framework 코드 첫째는 저장 프로 시저를 지원합니까?

일부 sp를 사용할 방법을 어떻게 선언 할 수 있습니까? 엔터티 속성을 sp 매개 변수에 수동으로 매핑하지 않고 sp를 호출하는 메서드에 엔터티를 전달할 수 있습니까?

또한 모델을 변경하면 어떻게됩니까? 그것은 모델에서 테이블을 재현하면서 내 SP를 떨어 뜨릴까요? 그리고 방아쇠는 어떨까요?

이러한 사항이 지원되지 않는 경우 나중에 지원할 계획이 있습니까?

+5

EF 로드맵은 EF 6이 코드 우선의 저장 프로 시저 및 함수를 지원함을 지적합니다. http://entityframework.codeplex.com/wikipage?title=Roadmap – frennky

+0

참고 사항 : http://stackoverflow.com/questions/4873607/how-to-use-dbcontext-database-sqlquerytelementsql-params-with-stored-proced –

답변

66

편집 : EF4.1 (아래)에 대한 원래의 답변은 현재 유효하지 않습니다. the answer below from Diego Vega (Microsoft의 EF 팀에서 일하는 사람)을 참조하십시오!


@gsharp 및 Shawn Mclean :이 정보는 어디에서 얻습니까? 기본 ObjectContext에 여전히 액세스 할 수 있습니까?

IEnumerable<Customer> customers = 
    ((IObjectContextAdapter)this) 
    .ObjectContext.ExecuteStoreQuery<Customer>("select * from customers"); 

"select"문을 저장된 proc로 바꾸면됩니다.

기타 질문 : 예, 불행히도 귀하의 s.p.가 파손될 것입니다. 코드에 "CREATE PROCEDURE"문을 추가해야 할 수도 있습니다. EF 4.2

:

var customers = context.Database.SqlQuery<Customer>("select * from customers") 
+0

감사합니다. 이 주제에 대한 더 많은 정보가있는 링크를 가르쳐 주시겠습니까? – frennky

+1

ObjectContext 개체 (ExecuteStoreQuery, ExecuteFunction 및 ExecuteStoreCommand)에서 세 가지 Execute 함수를 조회 할 수 있습니다. – anon

+0

나는 그 질문을 오해했다. 나는 코드를 기초로 SP를 만들고 싶다고 생각했다. – gsharp

50

업데이트 : EF6에서에, EF 코드 먼저 삽입, 업데이트에 대한 지원을 저장 프로 시저 매핑을 수행하고 삭제합니다. MapToStoredProcedures 메서드를 사용하여 모델을 만드는 동안 저장 프로 시저 매핑을 지정할 수 있습니다. 우리는 또한 이러한 작업을위한 기본 저장 프로 시저의 자동 스캐 폴딩을 지원합니다. 기능 사양 here을 참조하십시오.

원래 대답은 : 우리는 첫 번째 릴리스에서 코드 - 일층에서 모델에 매핑 저장 프로 시저를 지원하지 않습니다 않으며 우리는 자동으로 유형에서 CRUD 작업을위한 저장 프로 시저를 생성하는 방법이있을 것이다. 앞으로 추가 할 기능입니다.

이 스레드에서 언급했듯이 ObjectContext로 폴백 할 수도 있지만 DbContext는 네이티브 SQL 쿼리와 명령을 실행하는 좋은 API도 제공합니다 (예 : DbSet.SqlQuery, DbContext.Database.SqlQuery 및 DbContext.Database.SqlQuery 및 DbContext.Database.ExecuteSqlCommand).). 다른 SqlQuery 버전은 EF4에있는 기본 구체화 기능 (예 : ExecuteStoreQuery : http://msdn.microsoft.com/en-us/library/dd487208.aspx)을 가지고 있습니다.

희망이 도움이됩니다.

+6

BTW, 며칠 전에이 메서드를 사용하여 저장된 프로 시저를 호출하는 방법, 출력 매개 변수가 포함 된 저장 프로 시저에 대해서도 자세히 설명했습니다 (http://blogs.msdn.com/b/diego/archive/2012/01). /10/how-to-execute-stored-procedures-sqlquery-in-the-dbcontext-api.aspx. – divega

+3

2013 년 말, EF6은 아직 개발 중입니다. sprocs, 한숨에 대한 지원을 개선하기 위해 3 년을 기다렸습니다. – DOK

+1

@divega 스토어드 프로 시저에서 값을 선택하기위한 강력하게 형식화 된 지원이 있습니까?이 코드 우선 접근법은 객체 수명을 관리하는 것과 관련이 있습니다. 특히 복잡한 검색의 경우 totalRows 출력 매개 변수가있는 spFooSearch 저장 프로 시저를 사용합니다. –

31
public IList<Product> GetProductsByCategoryId(int categoryId) 
    { 
     IList<Product> products; 

     using (var context = new NorthwindData()) 
     { 
      SqlParameter categoryParam = new SqlParameter("@categoryID", categoryId); 
      products = context.Database.SqlQuery<Product>("Products_GetByCategoryID @categoryID", categoryParam).ToList(); 
     } 

     return products; 
    } 

    public Product GetProductById(int productId) 
    { 
     Product product = null; 

     using (var context = new NorthwindData()) 
     { 
      SqlParameter idParameter = new SqlParameter("@productId", productId); 
      product = context.Database.SqlQuery<Product>("Product_GetByID @productId", idParameter).FirstOrDefault(); 
     } 

     return product; 
    } 
8

보다 형 안전 솔루션이 될 것이다 :

http://strugglesofacoder.blogspot.be/2012/03/calling-stored-procedure-with-entity.html

이 클래스의 사용법은 다음과 같습니다

.NET 코어 (EntityFrameworkCore)에 대한
var testProcedureStoredProcedure = new TestProcedureStoredProcedure() { Iets = 5, NogIets = true }; 

var result = DbContext.Database.ExecuteStoredProcedure(testProcedureStoredProcedure); 
+0

링크가 더 이상 사용되지 않지만 http://web.archive.org/web/20150430090848/http://www.lucbos.net/2012/03/calling-stored-procedure-with-entity 링크가 활성화되었습니다. .html –

2

, 내가왔다 그 (것)들을 일할 수 있습니다.

깔끔하지는 않지만 분명히 작동 할 수 있습니다.

저장 프로 시저를 추가하는 마이그레이션 this 다음과 같습니다

using Microsoft.EntityFrameworkCore.Migrations; 
using System.Text; 

namespace EFGetStarted.AspNetCore.NewDb.Migrations 
{ 
    public partial class StoredProcedureTest : Migration 
    { 
     protected override void Up(MigrationBuilder migrationBuilder) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine("CREATE PROCEDURE GetBlogForAuthorName"); 
      sb.AppendLine("@authorSearch varchar(100)"); 
      sb.AppendLine("AS"); 
      sb.AppendLine("BEGIN"); 
      sb.AppendLine("-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements."); 
      sb.AppendLine("SET NOCOUNT ON;"); 
      sb.AppendLine("SELECT Distinct Blogs.BlogId, Blogs.Url"); 
      sb.AppendLine("FROM Blogs INNER JOIN"); 
      sb.AppendLine("Posts ON Blogs.BlogId = Posts.BlogId INNER JOIN"); 
      sb.AppendLine("PostsAuthors ON Posts.PostId = PostsAuthors.PostId Inner JOIN"); 
      sb.AppendLine("Authors on PostsAuthors.AuthorId = Authors.AuthorId"); 
      sb.AppendLine("Where Authors.[Name] like '%' + @authorSearch + '%'"); 
      sb.AppendLine("END"); 

      migrationBuilder.Sql(sb.ToString()); 
     } 

     protected override void Down(MigrationBuilder migrationBuilder) 
     { 
      migrationBuilder.Sql("DROP PROCEDURE GetBlogForAuthorName"); 
     } 
    } 
} 

내가 다음 following 코드로 호출 할 수 있습니다

var blogs = _context.Blogs.FromSql("exec GetBlogForAuthorName @p0", "rod").Distinct(); 

이후에 관련 데이터의 일부 (한을 받고 시도 많은 관계 데이터 (예 : 게시물 내용)와 블로그는 채워진 게시물 내용이 유출 된 것으로 돌아 왔습니다.

관련 문제