IT

Entity Framework Code First는 저장 프로 시저를 지원합니까?

lottoking 2020. 7. 27. 22:48
반응형

Entity Framework Code First는 저장 프로 시저를 지원합니까?


EF Code First의 프레젠테이션을 프레젠테이션을 EFCF가 저장 프로 시저와 어떻게 작동하는지.

일부 sp를 사용할 수있는 방법을 사용할 수 있습니까? 엔터티 속성을 sp 참조 변수에 수동으로 매핑하지 않고 sp를 호출하는 방법에 엔터티를 사용하는 경우?

또한 모델을 변경하면 어떻게? 모델에서 테이블을 다시 만드는 동안 내 sp가 삭제 검증? 그리고 트리거는 어떻습니까?

지원되지 않는 것이 지원되지, 앞으로 지원할 계획이 있습니까?


편집 : EF4.1 (아래)에 대한 나의 원래 답변이 이제 구식입니다. Diego Vega (Microsoft의 EF 팀에서 일하는 사람)의 아래 답변을 참조하십시오 !


@gsharp와 Shawn Mclean :이 정보를 얻었습니까? 여전히 기본 ObjectContext에 액세스 할 수 없습니까?

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

"select"문을 다시 proc로 바꾸면됩니다.

다른 질문에 문의는 : 예, 불행히도 귀하의 sp는 방해받을 것입니다. 코드에 "CREATE PROCEDURE"문을 추가해야 할 수도 있습니다.

EF 4.2의 경우 :

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

업데이트 : EF6부터 EF Code First는 삽입, 업데이트 및 삭제를위한 저장 프로 시저 매핑을 지원합니다. MapToStoredProcedures 메소드를 사용하여 모델 작성 중에 스토어드 프로 시저 매핑을 수 있습니다. 또한 설치를위한 기본 저장 프로 시저의 자동 스캐 폴딩도 지원합니다. 기능 사양은 여기를 참조 하십시오 .

원래 답변 생성 : 첫 번째 릴리스의 Code-First 모델에서 스토어드 프로 시저 매핑을 지원하지 않는 사용자 유형에서 CRUD 조작을위한 스토어드 프로 시저를 자동으로 할 수있는 방법이 없습니다. 하고자하는 것을 추가하고자하는 기능입니다.

DbContext는 기본 SQL 쿼리 및 명령 (예 : DbSet.SqlQuery, DbContext.Database.Database.SqlQuery 및 DbContext.Database.ExecuteSqlCommand)을 실행위한 훌륭한 API도 제공합니다. 다른 SqlQuery 버전에는 EF4에있는 기본 구현 기능 (예 : ExecuteStoreQuery : http://msdn.microsoft.com/en-us/library/dd487208.aspx )이 있습니다.

도움이 되셨기를 바랍니다.


    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;
    }


더 안전한 유형의 솔루션은 다음과 유연합니다.

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

이 클래스의 사용법은 다음과 가변합니다.

var testProcedureStoredProcedure = new TestProcedureStoredProcedure() { Iets = 5, NogIets = true };

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

.NET Core (EntityFrameworkCore)의 경우 작동 상태 수 있습니다.

가장 생소하지만 확실히 작동합니다.

프로 시저를 저장 추가하기위한 마이그레이션은 다음과 같습니다 .

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");
        }
    }
}

그런 다음 다음 코드 로 호출 할 수 있습니다.

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

나중에 관련 데이터 (일대 다 관계 데이터 (예 : Post 컨텐츠)를 가져 오기 시도 시도 컨텐츠 블로그는 Post 컨텐츠를 그대로 사용했습니다.

참고 URL : https://stackoverflow.com/questions/4845246/does-entity-framework-code-first-support-stored-procedures

반응형