Fork me on GitHub

关于EF的一个简单Demo

 
中华民国C#交流群
 今天使用EF的时候很奇怪的问题,添加属性后,使用程序包管理器控制台的NuGet命令更新无效,于是做了这个测试,一次性写好,自动更新,看看效果
1.首先建立一个MVC项目



2.我们选择Internet应用程序模板
 
 
3.确保程序引入了EF程序集,如果没有可以使用管理NuGet程序包联机下载最新版本的EntityFramework【也可以外部引用加载,但是由于使用的是CodeFirst模式,因此最低版本要求4.1】




 
4.为了简单演示我吧所有的需要创建类都放在一个文件里,代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ProductsEFDemo.Models
{
   public partial class Product
   {
       [HiddenInput(DisplayValue = false)]
       public int ProductID { get; set; }

       [Required(ErrorMessage = "Please enter a product name")]
       public string Name { get; set; }

       [Required(ErrorMessage = "Please enter a description")]
       [DataType(DataType.MultilineText)]
       public string Description { get; set; }

       [Required]
       [Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
       public decimal Price { get; set; }

       [Required(ErrorMessage = "Please specify a category")]
       public string Category { get; set; }

       public byte[] ImageData { get; set; }

       [HiddenInput(DisplayValue = false)]
       public string ImageMimeType { get; set; }
   }

   public class ProductContext : DbContext
   {
       public DbSet<Product> Products { get; set; }

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

   public class ProductsInitializer : DropCreateDatabaseIfModelChanges<ProductContext>
   {
       protected override void Seed(ProductContext context)
       {
           var products = new List<Product> {
               new Product{ Name="袜子", Description="黑丝袜", Category="生活用品",Price=110m},
               new Product{ Name="鞋子", Description="大头皮鞋", Category="生活用品", Price=125m},
               new Product{ Name="手表", Description="瑞士金表", Category="装饰品 ", Price=135.5m}
           };
           products.ForEach(p => context.Products.Add(p));
           context.SaveChanges();
       }
   }
}
由于我们此处覆盖了ProductContext默认的播种方法即数据的初始化方法,因此要重新注册这个DropCreateDatabaseIfModelChanges的子类

配置连接字符串【这里我使用VS2012自带的LocalDB数据库】
<connectionStrings>
   <add name="ProductContext" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=ProductDB;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\ProductDB.mdf" providerName="System.Data.SqlClient" />
 </connectionStrings>
 
5.我仅仅为了测试定义使用现有的HomeController中的Index方法,并添加了一个Edit方法开查看System.ComponentModel.DataAnnotations在定义的类中所起的作用是否有效,为了测试没有什么DI这类的概念,代码如下:
 
private ProductContext context = new ProductContext();

      public ViewResult Index()
      {
          return View(context.Products);
      }

      public ActionResult Edit(int productId)
      {
          var product = context.Products.FirstOrDefault(p => p.ProductID == productId);
          return View(product);
      }

 

6、创建两个强类型的视图





7.运行查看效果





8、程序正常,我们添加一个无关紧要的测试属性
 
10、不使用NuGet控制台命令直接运行程序,一切正常,自动生成和更新的表如下:
 
11.总结:NetGet命令有时候固然很重要,但是要是用不好,可能在进行数据库迁移的时候让你蛋碎的一地,所以如果你不熟悉可以手动建表或许更加高效和稳定。Over!

下面是用命令控制更新的演示,可以不用看
===============================================================
posted @ 2013-07-02 16:27  Halower  阅读(2405)  评论(1编辑  收藏  举报