2012-03-04 4 views
1

저는 정말 간단한 것을 시도하고 있습니다 만, Entity Framework에는 수십 가지 방법이있는 것 같지만 어느 것도 작동하지 않습니다.Entity Framework POCO 업데이트 엔터티?

나는 데이터베이스에서 읽은 POCO 클래스가 있으며 해당 클래스의 변경 사항으로 데이터베이스를 업데이트하려고합니다. 그것이 내가 원하는 전부입니다. 여기

내가 노력하고 무엇 : -

1) 내 POCO 클래스 : -

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.Web.Mvc; // Needs project reference to System.Web.Mvc 3.0.0.0 
using System.ComponentModel.DataAnnotations; // Needs project reference to System.ComponentModel.DataAnnotations 4.0.0.0 

namespace Trust.Domain.Entities 
{ 
    public class Product 
    { 
     [HiddenInput(DisplayValue=false)] 
     public Int32 ProductID { get; set; } 
     [Required(ErrorMessage = "Please enter a product name.")] 
     public String Name { get; set; } 
     [DataType(DataType.MultilineText)] 
     public String Description { get; set; } 
     public Decimal? PriceGuide { get; set; } 
     public Decimal? PriceSold { get; set; } 
     public Int32? HeightCM { get; set; } 
     public Int32? WidthCM { get; set; } 
     public Int32? DepthCM { get; set; } 
     [Required(ErrorMessage = "Please enter a list of keywords. Seperate each with a comma.")] 
     public String Keywords { get; set; } 
     public String SKU { get; set; } 
     public Int32 ProductStateID { get; set; } 
    } 
} 

2)이 POCO 클래스의 인스턴스를 업데이트하는 내 상황 : -

using System; using System.Collections.Generic; using System.Linq; 
using System.Text; 

using Trust.Domain.Entities; using Trust.Domain.Abstract; 

namespace Trust.Domain.Contrete { 
    public class EFProductRepository : IProductRepository 
    { 
     private EFDbContext context = new EFDbContext(); 

     public IQueryable<Product> Products 
     { 
      get { return context.Products; } 
     } 

     public Product GetProduct(int productID) 
     { 
      Product product = context.Products.Where(p => p.ProductID == productID).FirstOrDefault(); 
      return product; 
     } 

     public void SaveProduct(Product product) 
     { 
      if (product.ProductID == 0) 
      { 
       context.Products.Add(product); 
       context.SaveChanges(); 
      } 
      else 
      { 
       //context.AttachTo("Product", product); 
       //var contactEntry = Context.ObjectStateManager.GetObjectStateEntry(product); 
       //contactEntry.ChangeState(EntityState.Modified); 
       //_context.SaveChanges(); 

       //var findProduct = GetProduct(product.ProductID); 
       //context.ApplyCurrentValues("Product", product); 
       //context.SaveChanges(); 

       context.Products.Attach(product); 
       context.SaveChanges(); 

      } 
     } 

     public void DeleteProduct(Product product) 
     { 
      context.Products.Remove(product); 
      context.SaveChanges(); 
     } 
    } 
} 

3) EFDbContext는 다음과 같이 정의된다 : -

using System; using System.Collections.Generic; using System.Linq; 
using System.Text; 

using System.Data.Entity; // Needs Entity Framework 4.1 project 
reference. using System.Data.Entity.ModelConfiguration.Conventions; 

using Trust.Domain.Entities; 

namespace Trust.Domain.Contrete { 
    public class EFDbContext : DbContext 
    { 
     #region " Overrides " 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

      base.OnModelCreating(modelBuilder); 
     } 

     #endregion 

     #region " Entities " 

     public DbSet<Product> Products { get; set; } 

     #endregion 
    } 
} 

SaveProduct 루틴에서 ProductID가 0이 아닌지 확인합니다. 0이 아니면 데이터베이스의 엔터티를 업데이트하려고합니다. 이 코드에서는이 작업을 수행하는 세 가지 방법을 제시합니다. 처음 두 개는 사용하는 멤버가 존재하지 않기 때문에 컴파일하지 않기 때문에 주석 처리됩니다! 세 번째는 좋아 보이고 실행되며 전혀 데이터베이스를 변경하지 않습니다.

엔티티 프레임 워크는 다양하고 복잡하며 엔지니어링 된 기술이므로 다양한 방법으로 작업 할 수 있습니다. 누군가가 내가 만든 POCO 유형과 EFDbContext 기반 컨텍스트를 바탕으로 내 Product 엔티티를 업데이트하는 방법을 알려주실 수 있습니까? 내가하려고하는 일은 놀라 울 정도로 단순해야하며 왜 그렇지 않은지 나는 알지 못한다.

답변

2

이러한 멤버가 존재하지 않는 이유는 이전 ObjectContext API와 최신 DbContext API의 두 가지 EF API가 있다는 것입니다. 처음 두 솔루션은 ObjectContext API를 사용하지만 DbContext API를 사용하고 있습니다.

문제는 개체를 연결 만 첨부하지만 당신은 EF 엔티티가 저장한다는 것을 알 수 있도록 수정으로 표시해야하므로 그것이로 변경 표시됩니다 :

context.Products.Attach(product); 
context.Entry(product).State = EntityState.Modified; 
context.SaveChanges(); 

첫 번째 행 상태를 수정 된 상태로 설정하면 두 번째 엔티티가 연결되므로 어쨌든 대부분 불필요합니다.하지만이를 명확히하기 위해 코드에 유지하고 싶습니다.

+0

감사합니다. 그것은 그것을 해결했습니다. Entity Framework에는 많은 변형이 있습니다. 당신은 어떤 변형이 존재하는지, 어떻게 다른지, 어떻게 사용 하는지를 명시한 좋은 자원에 대해 알고 있습니까? 원래 EF는 마이크로 소프트의 훌륭한 아이디어 중 하나 였지만 그 이후로는 엉망이 된 것 같습니다. –

+0

두 가지 변종이 있습니다. DbContext API에 대한 다음 두 책을 확인하십시오. [프로그래밍 EF : 코드 우선] (http://www.amazon.com/Programming-Entity-Framework-Code-First/dp/1449312942/ref=sr_1_1?ie=UTF8&qid=1330895597&sr= 8-1), [Programming EF : DbContext] (http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/1449312969/ref=sr_1_2?ie=UTF8&qid=1330895597&sr=8-2) –

관련 문제