1. 程式人生 > >使用EF CodeFirst根據實體類生成資料庫

使用EF CodeFirst根據實體類生成資料庫

EF CodeFirst 建立資料庫

  1. 很多時候,一個專案只有模型層或者某幾個模型類,沒有資料庫指令碼,想建立資料庫來執行專案,只能一個個敲SQL建表語句或圖形化操作,十分耗時間,也很費腦細胞,
  2. 最近發現可以利用EF 裡的自動建立資料庫的功能,可以節約不少時間,資料庫建立後可能跟實際資料庫細節方面有所偏差,但的確節省不少勞力,
  3. 資料庫生成後,我們只需要修改欄位型別,刪除不必要的表與表之間的關係,新增一部分聚集索引,非聚集索引。

一.首先VS2013以上版本建立MVC4或者MVC5專案,在MVC自動生成的Models資料夾下,把你需要建立資料表的類新增進去,如圖:

這裡寫圖片描述

Blog.cs實體類

[Table("Blog")]
    public class Blog
    {
        public Blog()
        {
            Tags = new HashSet<Tag>();
            Users = new HashSet<User>();
            Posts = new HashSet<Post>();
            SecurityKey = Guid.NewGuid();
        }

        public virtual int Id { get
; set; } public virtual Guid SecurityKey { get; set; } public virtual ICollection<Post> Posts { get; set; } public virtual ICollection<User> Users { get; set; } public virtual ICollection<Tag> Tags { get; set; } public virtual string Title { get
; set; } public virtual string Subtitle { get; set; } public virtual string LogoImage { get; set; } public virtual bool AllowsComments { get; set; } public virtual DateTime CreatedAt { get; set; } }

Category.cs實體類

[Table("Category")]
    public class Category
    {
        public Category()
        {
            Posts = new HashSet<Post>();
        }

        public virtual string Name { get; set; }

        public virtual int Id { get; set; }

        public virtual ICollection<Post> Posts { get; set; }
    }

Comment.cs實體類

[Table("Comment")]
    public class Comment
    {
        public virtual int Id { get; set; }

        public virtual Post Post { get; set; }

        public virtual string Name { get; set; }

        public virtual string Email { get; set; }

        public virtual string HomePage { get; set; }

        public virtual int Ip { get; set; }

        public virtual string Text { get; set; }
    }

Post.cs實體類

 [Table("Post")]
    public class Post
    {
        public Post()
        {
            Tags = new HashSet<Tag>();
            Categories = new HashSet<Category>();
            Comments = new HashSet<Comment>();
        }


        public virtual int Id { get; set; }


        public virtual Blog Blog { get; set; }


        public virtual User User { get; set; }


        public virtual string Title { get; set; }


        public virtual string Text { get; set; }

        public virtual DateTime PostedAt { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }

        public virtual ICollection<Category> Categories { get; set; }

        public virtual ICollection<Tag> Tags { get; set; }
    }

ReadOnlyBlog.cs實體類

    [Table("ReadOnlyBlog")]
    public class ReadOnlyBlog
    {
        public virtual int Id { get; set; }
        public virtual string Title { get; set; }
    }

Tag.cs實體類

       [Table("Tag")]
    public class Tag
    {
        public virtual int Id { get; set; }

        public virtual object Entity { get; set; }

        public virtual string Name { get; set; }
    }

User.cs實體類

 [Table("User")]
    public class User 
    {
        public User()
        {
            Posts = new HashSet<Post>();
            Blogs = new HashSet<Blog>();
        }

        public virtual ICollection<Blog> Blogs { get; set; }

        public virtual ICollection<Post> Posts { get; set; }

        public virtual int Id { get; set; }

        public virtual byte[] Password { get; set; }


        public virtual string Email { get; set; }


        public virtual string Username { get; set; }

        public virtual DateTime CreatedAt { get; set; }

        public virtual string Bio { get; set; }

    }

建立資料庫 上下文,把AccountModels原先的實體刪掉,改成如下樣子,並且刪除AccountController,不然編譯通不過

   //類要繼承自DbContext,而DbContext類在System.Data.Entity名稱空間下
    public class UsersContext : DbContext
    {
        public UsersContext()
            : base("DefaultConnection")
        {
        }
        public DbSet<Blog> Blog { get; set; }
        public DbSet<Category> Category { get; set; }
        public DbSet<Comment> Comment { get; set; }
        public DbSet<Post> Post { get; set; }
        public DbSet<ReadOnlyBlog> ReadOnlyBlog { get; set; }
        public DbSet<Tag> Tag { get; set; }
        public DbSet<User> User { get; set; }
    }

接著,我們在Web.Config裡配置一下資料庫的連線字串

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

最後我們使用HomeController來Index方法來執行生成,注意一定要將全部實體類跑一遍,才能觸發生成對應的表

這裡寫圖片描述

生成的結果如圖:

這裡寫圖片描述

資料關係圖:

這裡寫圖片描述

相關推薦

使用EF CodeFirst根據實體生成資料庫

EF CodeFirst 建立資料庫 很多時候,一個專案只有模型層或者某幾個模型類,沒有資料庫指令碼,想建立資料庫來執行專案,只能一個個敲SQL建表語句或圖形化操作,十分耗時間,也很費腦細胞, 最近發現可以利用EF 裡的自動建立資料庫的功能,可以節約不少時間

添加註解後,框架沒有自動根據實體生成資料表,Hibernate

@Id註解:指定實體Bean的主鍵對映,需在getter方法上標註。@GeneratedValue註解:用於指定主鍵生成策略,註解支援的主鍵生成策略有: AUTO——相當於配置檔案中的native,根據底層資料庫自動選擇使用IDENTITY、SEQUENCE、TABLE型別(預設值)TABLE——使用ta

[開源] FreeSql.AdminLTE.Tools 根據實體生成後臺管理程式碼

前言 FreeSql 釋出至今已經有9個月,功能漸漸完善,自身的生態也逐步形成,早在幾個月前寫過一篇文章《ORM 開發環境之利器:MVC 中介軟體 FreeSql.AdminLTE》,您可以先閱讀上一篇文章內容瞭解來龍去脈,再回到這裡觀看。 我個人非常喜歡小規模團隊的"單打獨鬥",有的時候即使在大公司,也是做

mybatis-generator資料庫註釋實體生成以及generatorConfig檔案配置

專案裡新建表時model,mapper以及mapper.xml基本都是用Mybatis Generator(以下簡稱為MBG)自動生成的,但是MBG自動生成的model的註釋實在有點非人類,至少中國人是完全接受不了的,在配置中禁用掉註釋吧,倒是簡單了,可是生成的model類光禿禿的,啥都沒有,欄位方法沒有註釋

mybatis generator為實體生成自定義註釋(讀取資料庫欄位的註釋新增到實體,不修改原始碼)

我們都知道mybatis generator自動生成的註釋沒什麼實際作用,而且還增加了程式碼量。如果能將註釋從資料庫中撈取到,不僅能很大程度上增加程式碼的可讀性,而且減少了後期手動加註釋的工作量。 1、首先定義註釋生成外掛 package com.cmbc.datapla

反射+註釋,根據實體物件生成SQL語句工具

最近在寫一個公司內部專案,由於覺得配置Hibernate過於繁瑣,索性使用了spring的jdbc,可是又要寫很多的sql語句,為了偷偷懶,於是就寫個能通過實體類物件生成SQL語句的工具類。 目前只在MySql資料庫上實驗通過,其他資料庫未測試。 本工具類還有很多不足之

EF-DbUpdateException--實體資料庫列不對應的解決方案

錯誤資訊 1.VS實體類裡面的欄位 2資料庫裡面的欄位 猜測是因為欄位數不匹配導致的 3刪除多餘欄位 5.結果 錯誤資訊貼上: -------------------------Log_Header-------------------------2015-06-06

eclipse怎樣配置hibernate和反向生成實體(mysql資料庫)

我真的受夠了,網路上對這個問題的回答隻言片語,也說不清楚,於是我決定自己寫一份,為了讓自己以後配置起來方便鞋,也希望大家少走彎路。 前提是先安裝好了eclipse和mysql資料庫。 1在Eclipse中新建一個測試工程 下載hibernate的jar包 下載下來之後

JFinal極速開發框架使用筆記(四) _JFinalDemoGenerator實體生成及映射自動化

checked rem 獲取 fig res ner constant 生成器 項目 運行_JFinalDemoGenerator生成實體類和映射之前的項目結構: 運行之後: 生成和改變的文件: 實體類: package com.wazn.model; import

mybatis generator為實體生成自定義註釋(讀取數據庫字段的註釋添加到實體,不修改源碼)

super() .cn setter www. nts art pca target private 我們都知道mybatis generator自動生成的註釋沒什麽實際作用,而且還增加了代碼量。如果能將註釋從數據庫中撈取到,不僅能很大程度上增加代碼的可讀性,而且減少了後期

Java根據實體快速生成物件

一、來源   在寫程式碼時總是遇到下面這種情況: Account account = new Account(); account.setId(); account.setGmtCreate(); account.set

java 根據實體物件生成 增刪改的SQL語句 ModelToSQL

package com.xxx.utils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; import java.util.Vector; import org.a

組合主鍵——實體——Oracle資料庫

@Entity @Table(name = "XXXX") public class RolePrivilegeMap implements CmsMainBo { private RolePrivilegeMapId id; @EmbeddedId

DevExpress MVC 中使用XPO對映實體資料庫時拋異常的解決

    錯誤異常如上,可能發生的原因是:在寫實體類時,把關係欄位添加了Persistent屬性導致的:         注意在關聯關係的屬性中,不能新增Persistent屬性  

List根據實體的某個屬性升序或者降序來排列

介紹 最近做的一個前臺的頁面的獲曲資料庫某個表的列表的功能,要求按照表的某個屬性來升序最好不要動mybatis,所以通過mybatis獲取的list,通過方法的 Collections.sort(list, new Comparator() {…});進行排序 升序 / 降序 i

EF CodeFirst資料遷移與防資料庫刪除

1 開啟migrations功能 enable-migrations -force 2 新增遷移版本 add-migration 名稱字尾 我們每次修改實體後,都應該使用這個add-migration來升級歷史版本 3 更新資料庫 update-database

實體資料庫多對一和一對多對映

用Teacher類和Grade舉例,Teacher類包含grade類的屬性,Grade也包含Teacher類的屬性,但是Grade中的Teaher屬性要用List<Teahcer> 這就是多對一和一對多,實體類程式碼如下: ------------------------------

MyBatis由淺入深學習總結之二:MyBatis解決Java實體資料庫表字段不一致方法總結

在此,首先說明一點任何永續性框架都需要解決一個問題,那就是Java實體類的欄位一般來說基本上會與資料庫表中欄位不一致,那麼它們是如何解決的呢?咱們以Hibernate和SpringJDBC為例說明一下; 1、Hibernate中一般通過XML對映和註解的方式解決不一致問題,

Hibernate之*hbm.xml檔案和實體操作資料庫實現插入和查詢

一、實體類(Entity) package com.javademo; import java.util.Date; public class Event { private Long id; private String title;

使用ef codefirst開發,無法建立資料庫的問題

    解決辦法:開啟Nugut程式包管理器控制檯,預設專案選擇:EntityFramework;輸入:Update-Database -Verbose                      Update-Database -StartUpProjectName "MyP