新的一年,新的開始。
今天總結的主題是在MySql中應用EntityFramework 的Code First模式。
開發環境:Win8 + MySql5.5 +VS 2012.
第一步是在資料庫中建立一個表,具體欄位如。
在表中添加若干資料:
資料建好之後,下面就是在項目中引用EntityFramework了。
二,在項目中建立一個實體類Product
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
注意,成員名要與資料庫中的名相同。
然後建立一個介面 IProductRepository
public interface IProductRepository
{
IQueryable<Product> Products { get; }
}
之後,是實現介面的類
public class EFProductRepostitory:IProductRepository
{
private EFDbContext context = new EFDbContext();
public IQueryable<Entities.Product> Products
{
get { return context.Products; }
}
}
實現與資料庫上下文關聯
public class EFDbContext:DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Friend> Friends { get; set; }
}
然後在Controller中實現調用
public class ProductController : Controller { private int pageSize = 4; private IProductRepository repository; public ProductController(IProductRepository productRepository) { repository = productRepository; } public ViewResult List(int page=1) { return View(repository.Products .OrderBy(p=>p.ProductID) .Skip((page-1)*pageSize) .Take(pageSize)); } }
在Ninject產生Controller的類中綁定。
public class NinjectControllerFactory:DefaultControllerFactory { private IKernel ninjectKernel; public NinjectControllerFactory() { ninjectKernel = new StandardKernel(); AddBindings(); } protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) { return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); } public void AddBindings() { //Mock<IProductRepository> mock = new Mock<IProductRepository>(); //mock.Setup(m => m.Products).Returns(new List<Product> { // new Product{ Name=" football", Price=25}, // new Product{ Name="basketball" , Price=30}, // new Product{ Name="PingPang" , Price=40} //}.AsQueryable()); //ninjectKernel.Bind<IProductRepository>().ToConstant(mock.Object); ninjectKernel.Bind<IProductRepository>().To<EFProductRepostitory>(); ninjectKernel.Bind<IFriend>().To<EFFriend>(); }
最後需要注意的一點是,設定檔中寫資料庫連接的地方要與DbContext的類名保持一致。
<connectionStrings> <!--<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-SportStore.UI-20121214161900;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-SportStore.UI-20121214161900.mdf" />--> <add name="EFDbContext" connectionString="Database=sportstore;Data Source=localhost;User Id=root;Password=root" providerName="MySql.Data.MySqlClient"/> </connectionStrings>