【发布时间】:2012-03-22 10:06:29
【问题描述】:
我正在尝试做一些非常非常简单的事情,但是 Entity Framework 似乎有很多方法可以做到这一点,但似乎都不起作用。
我有一个从数据库中读取的 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 是否不为零。如果它不为零,那么我尝试更新数据库中的实体。在这段代码中,我展示了我发现的三种方法。前两个被注释掉,因为它们甚至不编译,因为它们使用的成员不存在!第三个看起来不错,运行并且根本不更改数据库。
实体框架是一项庞大、复杂且过度设计的技术,因此有很多方法可以做任何事情。有人可以告诉我如何在给定 POCO 类型和我创建的基于 EFDbContext 的上下文的情况下更新我的产品实体。我正在尝试做的事情应该非常简单,我不知道为什么不是。
【问题讨论】:
标签: entity-framework entity poco objectcontext