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 컨텐츠를 그대로 사용했습니다.
'IT' 카테고리의 다른 글
상태 표시 줄이 캐시 된 시간이 없습니다. (0) | 2020.07.28 |
---|---|
공유 라이브러리에서 동적으로 링크 될 때 전역 및 정적 변수는 어떻게? (0) | 2020.07.27 |
정적 인덱서? (0) | 2020.07.27 |
Linux에서 여러 가지로 신호 처리 (0) | 2020.07.27 |
프로토콜이 자체 준수하지 않습니까? (0) | 2020.07.27 |