posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

1.建立MVC项目》NuGet安装EF

2.建立模型:

复制代码
public class Blog
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
        public DateTime Time { get; set; }
        public string Summary { get; set; }
        public string Content { get; set; }
        public virtual ICollection<Comment> Comments { get; set; } = new List<Comment>();
    }

 public class Comment
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }
        public string VisitorName { get; set; }
        public string Email { get; set; }
        public DateTime Time { get; set; }
        public string Content { get; set; }

        [ForeignKey("Blog")]
        public Guid BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }
复制代码

模型需要引用命名空间:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

3.建立数据库类 DbContext:

复制代码
public class EFDbContext : DbContext
    {
        public DbSet<Product> Products { get; set; }
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Comment> Comments { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();  //去除“设置表名为复数”这条约定
        }
    }
复制代码

DbContext需要引用命名空间:

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

4.配置web.config数据库连接,连接名称需要是EFDbContext,和建立的DbContext名称一致;或者在EFDbContext中使用构造函数指定连接名称:

public EFDbContext() : base("数据库链接的结点名字") { }

<add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=db_codefirst_test;Persist Security Info=True;User ID=sa;Password=123456;" providerName="System.Data.SqlClient" />

记得加上:providerName="System.Data.SqlClient"

5.新建一个测试Controller,选择具有增删改查的模板,然后选择对应的模型类、数据库上下文类。

6.运行程序,浏览刚才建的Controller的View,数据库就自动建好了。

7.要是修改模型类,数据库中的表需要删了重建。

8.可自动根据模型变化重新建库,并插入初始化数据,选择不同模式即可。

DropCreateDatabaseIfModelChanges:当模型改变时,重新建库;

DropCreateDatabaseAlways:每次启动程序时,重新建库;

Seed方法用来插入数据。

复制代码
/// <summary>
    /// 数据库初始化
    /// </summary>
    public class BaseInitializer : DropCreateDatabaseIfModelChanges<EFDbContext>
    {
        //CreateDatabaseIfNotExists:数据库不存在时重新创建数据库
        //DropCreateDatabaseIfModelChanges:当模型改变时,重新建库;
        //DropCreateDatabaseAlways:每次启动程序时,重新建库;
        protected override void Seed(EFDbContext context)
        {
            var blogs = new List<Models.Blog>
            {
                new Models.Blog{ Author="小明", Content="老师:小明,你给我滚出去!", Time=DateTime.Now, Title="小明日常", Comments=new List<Models.Comment>(){
                    new Comment(){ Content = "test", Email="908085411@qq.com", Time=DateTime.Now, VisitorName="jay.x" }
                } },
                new Models.Blog{ Author="小红", Content="老师:小红,你去看看小明去哪儿了!",  Time=DateTime.Now, Title="小红日常"},
                new Models.Blog{ Author="小蓝", Content="小蓝:老师,小明和小红在玩游戏!",  Time=DateTime.Now, Title="小蓝日常"},
                new Models.Blog{ Author="小白", Content="小白:我去看看!",  Time=DateTime.Now, Title="小白日常"},
                new Models.Blog{ Author="小黄", Content="小黄:我也去看看!",  Time=DateTime.Now, Title="小黄日常"}
            };

            blogs.ForEach(s => context.Blogs.Add(s));
            context.SaveChanges();

            var cou = new List<Models.Product>
            {
                new Models.Product{ Name="西瓜", Price=decimal.Parse("3.5")},
                new Models.Product{ Name="油桃", Price=decimal.Parse("8")},
            };

            cou.ForEach(c => context.Products.Add(c));
            context.SaveChanges();
        }
    }
BaseInitializer
复制代码

在Global中注册这个初始化类:

protected void Application_Start()
        {
            .........

            //添加建表  
            Database.SetInitializer<EFDbContext>(new BaseInitializer());
        }

//添加自动化建表,一般情况第一次运行需要这么写
//当修改了Model,又不想删除重建的时候,把SetInitializer的参数设null。
//原因是:删除重建会把测试数据也清除了
//Database.SetInitializer<EFDbContext>(null);
Database.SetInitializer<EFDbContext>(new BaseInitializer());
误删表,如何恢复:http://www.cnblogs.com/bleychen/p/4350913.html

EF通用数据层封装类:https://www.cnblogs.com/qtqq/p/6942312.html

posted on   邢帅杰  阅读(209)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示