zoukankan      html  css  js  c++  java
  • 使用EF完成基于SQLite的CodeFirst

    使用EF完成基于SQLite的CodeFirst

    操作流程

    引用类库

    1. System.Data.SQLite,这个类库是SQlite的核心支持,使用别的ORM框架也需要,例如:LINQ2DBSQLite

    2. SQLite.CodeFirst,EF本身不支持SQLite的CodeFirst模式,这是一个大佬做的封装,引入以后,只需要做少部分修改,就可以丝滑的支持CodeFirst.虽然只引入System.Data.SQLite也可以使用,但是引入SQLite.CodeFirst更丝滑,省事,谁会不喜欢他那。

    SQLite.CodeFirst项目地址:https://github.com/msallin/SQLiteCodeFirst

    修改配置文件

    引入System.Data.SQLite以后,项目内多出两个文件:

    1. App.config,这个文件是核心,配置数据库连接字符串,数据库相关配置,我们主要修改这个文件的内容。
    2. packages.config

    修改App.config,具体为什么这么修,原因很简单,你只引入System.Data.SQLite,然后按照官网的三个命令依次跑一边,根据弹出的3-5个坑踩一遍就知道了,复制粘贴他不香吗?

    第一步:完全复制下列代码,覆盖App.config中的内容

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    	<configSections>
    		<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    		<section name="entityFramework"
    				 type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    				 requirePermission="false" />
    	</configSections>
    	<startup>
    		<supportedRuntime version="v4.0"
    						  sku=".NETFramework,Version=v4.6.1" />
    	</startup>
    	<entityFramework>
    		<providers>
    			<provider invariantName="System.Data.SqlClient"
    					  type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    			<provider invariantName="System.Data.SQLite.EF6"
    					  type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    			<provider invariantName="System.Data.SQLite"
    					  type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    		</providers>
    	</entityFramework>
    	<system.data>
    		<DbProviderFactories>
    			<remove invariant="System.Data.SQLite.EF6" />
    			<add name="SQLite Data Provider (Entity Framework 6)"
    				 invariant="System.Data.SQLite.EF6"
    				 description=".NET Framework Data Provider for SQLite (Entity Framework 6)"
    				 type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
    			<remove invariant="System.Data.SQLite" />
    			<add name="SQLite Data Provider"
    				 invariant="System.Data.SQLite"
    				 description=".NET Framework Data Provider for SQLite"
    				 type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    		</DbProviderFactories>
    	</system.data>
    	<connectionStrings>
    		<add name="Library"
    			 connectionString="data source=Library.db;initial catalog=WpfApp2.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
    			 providerName="System.Data.SQLite.EF6" />
    	</connectionStrings>
    </configuration>
    

    第二步:修改connectionStrings中的数据库连接字符串

    只需要修改 name="Library" connectionString="data source=Library.db中的内容

    1. name是数据库连接字符串的别名,待会会用到。
    2. connectionString,你自己的数据库连接字符串,推荐直接按照博文内容chishuiguo.db,直接写数据名,这样操作最简单也安全便捷,你只需要将SQLite的数据库文件放到项目的bin文件同级目录即可(CodeFirst运行以后,创建的新表的数据库文件会出现在bin文件下)。
    <connectionStrings>
        <add name="Library"
             connectionString="data source=Library.db;initial catalog=WpfApp2.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
             providerName="System.Data.SQLite.EF6"/>
    </connectionStrings>
    

    创建Entity类

    public class LibraryDbContext : DbContext
    {
        //数据库连接字符串
        public LibraryDbContext():base("Library"){}
    
        //很多人失败就是没有这个重写,这是SQLite.CodeFirst这个包的支持,有了这句才可以丝滑的CodeFirst
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<LibraryDbContext>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
    
        //DbSet 通知 EF 哪些 C# 实体应映射到数据库。
        public DbSet<Author> Authors { get; set; }
    }
    
    //需要映射的实体
    public class Author
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
    
        [Required]
        [MaxLength(20)]
        public string Name { get; set; }
    
        [Required]
        [MaxLength(40)]
        public string BirthPlace { get; set; }
    
        [Required]
        [EmailAddress]
        public string Email { get; set; }
    }
    
    

    创建表

    其实到了第三步操作没问题,任务就结束了,因为引入了CodeFirst类库,所以会自动创建,第一次因为要做映射会慢一点,以后启动都很快,操作起来很简单,调用你的类库,然后F5让项目跑起来,这里做个抛砖引玉。

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            using (LibraryDbContext db = new LibraryDbContext())
                {
                    Author author = new Author()
                    {
                        Name = "李四",
                        BirthPlace = "火星",
                        Email = "123456@qq.com",
                    };
                    db.Authors.Add(author);
                    db.SaveChanges();
                }
        }
    }
    

    到了这里基本的使用就完成了,如果要查看自己的表,到bin文件下面查看即可。

    EF+SQLite的DAL类库创建

    这里的坑巨多,博主尝试了非常多次,才总结出了如下的操作步骤和操作要点,如果用的到请来个三连撒哈哈。

    操作流程

    1. DAL类库设置:类库引入:EntityFramework、SQLite.CodeFirst。
    2. 数据库文件:数据库文件放在实体所在的DAL类库内。
    3. 项目引用:所有引用了使用了EF创建的DAL类库的程序集,都必须安装EntityFramework。
    4. 启动项设置:引用类库的启动项,需要引入System.Data.SQLite类库,并且将App.config这个文件从DAL类库剪切过来,App.config放在项目启动项。
    5. 生成的数据库文件:生成的数据库文件在启动项bin文件下面,并不在DAL类库内。
    6. 增加新字段,自动生成新的表,需要先删除启动项bin文件下的数据库文件,然后运行才可以自动生成新的数据库文件。

    注意事项

    1. 操作流程不能有任何错误,尤其需要注意,启动项的类库引用、配置文件的放置位置、数据库文件的防止位置。
    2. 配置文件DAL类库和启动项都需要,
    3. 如果需要生成新的表,需要删除启动项bin内的数据库文件
    4. 不要百分百相信创建初期的错误提示,会搞死个人,尤其当你的启动项没有设置好的时候,很多时候的报错牛头不对马嘴

    其他

    大家如果有其他关于EF+SQLite的DAL类库创建方式或者踩过的坑,如果方便请务必评论区一起交流下,多多交流才能一起进步,大佬们带带我。

    EF常用命令

    1. Install-Package EntityFramework ,已在项目“EasyWeChat.Data”中启用迁移。若要覆盖现有迁移配置,请使用 -Force 参数。

    2. Enable-Migrations, Code First 迁移.

    3. Add-Migration ,将检查自上次迁移后发生的更改,可以为迁移指定一个名称,将基于自上次迁移创建以来对模型所做的更改来构建下一次迁移.

    4. Update-Database ,将任何挂起的迁移应用到数据库.

    其他模板

    /// <summary>
    /// 代码指定数据库连接
    /// </summary>
    /// <param name="existingConnection"></param>
    /// <param name="contextOwnsConnection"></param>
    public MyContext(DbConnection existingConnection, bool contextOwnsConnection) :
        base(existingConnection, contextOwnsConnection)
    {
        ConfigurationFunc();
    }
    
    private void ConfigurationFunc()
    {
        Configuration.LazyLoadingEnabled = true;
        Configuration.ProxyCreationEnabled = true;
    }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var initializer = new SqliteDropCreateDatabaseWhenModelChanges<MyContext>(modelBuilder);
        Database.SetInitializer(initializer);
    } 
    

    报错处理

    1. No context type was found in the assembly 'TestShell'.

    程序包管理器控制台,默认项目选择错误导致的

    文章推荐:https://blog.csdn.net/haorenSW7/article/details/103636419

    文章推荐:https://www.cnblogs.com/liujianshe1990-/p/13189083.html

    1. 具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常。

    文章推荐:https://blog.csdn.net/qq_35260798/article/details/106904924

    1. F5运行正常没有生成对应的数据库,使用对应的命令。

    其他异常:报错的异常原封不动谷歌都会有结果,这里就不浪费时间了,一般出异常大概率是App.config问题,然后就是DbContext,这两个没问题基本都可以正常跑。

    登峰造极的成就源于自律
  • 相关阅读:
    js搜索输入关键词
    pc端,自适应屏幕分辨率
    js获取锚点名称 #
    yourphp读取分类名称{$Categorys[$r[catid]]['catname']}
    收缩菜单 css变样
    ajax成功跨域_自己写的
    json 是个什么东西?
    json_encode详解,转义
    跨域代码 手机号码
    php json_decode
  • 原文地址:https://www.cnblogs.com/fishpond816/p/14458959.html
Copyright © 2011-2022 走看看