創(chuàng)建ASP.NET Core MVC應(yīng)用程序(3)-基于Entity Framework Core(Code First)創(chuàng)建MySQL數(shù)據(jù)庫表

創(chuàng)建ASP.NET Core MVC應(yīng)用程序(3)-?基于Entity Framework Core(Code First)創(chuàng)建MySQL數(shù)據(jù)庫表

創(chuàng)建數(shù)據(jù)模型類(POCO類)

Models文件夾下添加一個(gè)User類:

namespace MyFirstApp.Models
{
    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Bio { get; set; }
    }
}

除了你期望的用來構(gòu)建Movie模型的屬性外再愈,將作為數(shù)據(jù)庫主鍵的ID字段是必須的。

安裝Entity Framework Core MySQL相關(guān)依賴項(xiàng)

注:其中"MySql.Data.EntityFrameworkCore": "7.0.6-ir31",要7.0.6以上版本包竹。
Missing implementation for running EntityFramework Core code first migration蚕冬。

創(chuàng)建Entity Framework Context數(shù)據(jù)庫上下文

Models文件夾下添加一個(gè)UserContext類:

/// <summary>
/// The entity framework context with a User DbSet
/// > dotnet ef migrations add MyMigration
/// </summary>
public class UserContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var builder = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        var configuration = builder.Build();

        string connectionString = configuration.GetConnectionString("MyConnection");

        optionsBuilder.UseMySQL(connectionString);
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<User>().HasKey(m => m.ID);
        base.OnModelCreating(builder);
    }
}

OnConfiguring方法里面的指定使用MySQL provider及具體的連接字符串等邏輯也可以統(tǒng)一放到Startup類中的ConfigureServices方法中:

public void ConfigureServices(IServiceCollection services)
{
    string connectionString = Configuration.GetConnectionString("MyConnection");

    services.AddDbContext<UserContext>(options =>
        options.UseMySQL(connectionString)
    );

    // Add framework services.
    services.AddMvc();
}

注:UseMySQLMySQL.Data.EntityFrameworkCore.Extensions里面的一個(gè)擴(kuò)展方法婶肩,所以要手動(dòng)添加using MySQL.Data.EntityFrameworkCore.Extensions;命名空間陵霉。這個(gè)小問題也花費(fèi)了我不少的時(shí)間和精力。

創(chuàng)建數(shù)據(jù)庫

通過Migrations工具來創(chuàng)建數(shù)據(jù)庫析孽。

運(yùn)行dotnet ef migrations add MyMigration Entity Framework .NET Core CLI Migrations命令來創(chuàng)建一個(gè)初始化遷移命令搭伤。

運(yùn)行dotnet ef database update應(yīng)用一個(gè)你所創(chuàng)建的新的遷移到數(shù)據(jù)庫。因?yàn)槟愕臄?shù)據(jù)庫還沒不存在袜瞬,它會(huì)在遷移?被應(yīng)用之前為你創(chuàng)建所需的數(shù)據(jù)庫怜俐。

然后就會(huì)在項(xiàng)目生成Migrations文件夾,包括20161121064725_MyMigration.cs文件、20161121064725_MyMigration.Designer.cs文件和UserContextModelSnapshot.cs文件:

20161121064725_MyMigration.Designer.cs類:

[DbContext(typeof(UserContext))]
[Migration("20161121064725_MyMigration")]
partial class MyMigration
{
    protected override void BuildTargetModel(ModelBuilder modelBuilder)
    {
        modelBuilder
            .HasAnnotation("ProductVersion", "1.0.0-rtm-21431");

        modelBuilder.Entity("MyFirstApp.Models.User", b =>
            {
                b.Property<int>("ID")
                    .ValueGeneratedOnAdd();

                b.Property<string>("Bio");

                b.Property<string>("Email");

                b.Property<string>("Name");

                b.HasKey("ID");

                b.ToTable("Users");
            });
    }
}

20161121064725_MyMigration.cs Partial類:

public partial class MyMigration : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Users",
            columns: table => new
            {
                ID = table.Column<int>(nullable: false)
                    .Annotation("MySQL:AutoIncrement", true),
                Bio = table.Column<string>(nullable: true),
                Email = table.Column<string>(nullable: true),
                Name = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Users", x => x.ID);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Users");
    }
}

UserContextModelSnapshot類:

[DbContext(typeof(UserContext))]
partial class UserContextModelSnapshot : ModelSnapshot
{
    protected override void BuildModel(ModelBuilder modelBuilder)
    {
        modelBuilder
            .HasAnnotation("ProductVersion", "1.0.0-rtm-21431");

        modelBuilder.Entity("MyFirstApp.Models.User", b =>
            {
                b.Property<int>("ID")
                    .ValueGeneratedOnAdd();

                b.Property<string>("Bio");

                b.Property<string>("Email");

                b.Property<string>("Name");

                b.HasKey("ID");

                b.ToTable("Users");
            });
    }
}

新創(chuàng)建的數(shù)據(jù)庫結(jié)構(gòu)如下:

將上述的Migrations文件夾中的代碼與MySQL數(shù)據(jù)庫表__EFMigrationsHistory對照一下邓尤,你會(huì)發(fā)現(xiàn)該表是用來跟蹤記錄實(shí)際已經(jīng)應(yīng)用到數(shù)據(jù)庫的遷移信息拍鲤。

創(chuàng)建User實(shí)例并將實(shí)例保存到數(shù)據(jù)庫

public class Program
{
    public static void Main(string[] args)
    {
        using (var db = new UserContext())
        {
            db.Users.Add(new User { Name = "Charlie Chu", Email = "charlie.thinker@aliyun.com", Bio = "I am Chalrie Chu." });
            var count = db.SaveChanges();

            Console.WriteLine("{0} records saved to database", count);

            Console.WriteLine();

            Console.WriteLine("All users in database:");
            foreach (var user in db.Users)
            {
                Console.WriteLine(" - {0}", user.Name);
            }
        }
    }
}

參考文檔

個(gè)人博客

我的個(gè)人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市汞扎,隨后出現(xiàn)的幾起案子季稳,更是在濱河造成了極大的恐慌,老刑警劉巖澈魄,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件景鼠,死亡現(xiàn)場離奇詭異,居然都是意外死亡痹扇,警方通過查閱死者的電腦和手機(jī)铛漓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帘营,“玉大人票渠,你說我怎么就攤上這事》移” “怎么了问顷?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長禀梳。 經(jīng)常有香客問我杜窄,道長,這世上最難降的妖魔是什么算途? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任塞耕,我火速辦了婚禮,結(jié)果婚禮上嘴瓤,老公的妹妹穿的比我還像新娘扫外。我一直安慰自己莉钙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布筛谚。 她就那樣靜靜地躺著磁玉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驾讲。 梳的紋絲不亂的頭發(fā)上蚊伞,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機(jī)與錄音吮铭,去河邊找鬼时迫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谓晌,可吹牛的內(nèi)容都是我干的掠拳。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼扎谎,長吁一口氣:“原來是場噩夢啊……” “哼碳想!你這毒婦竟也來了烧董?” 一聲冷哼從身側(cè)響起毁靶,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逊移,沒想到半個(gè)月后预吆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胳泉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年拐叉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扇商。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凤瘦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出案铺,到底是詐尸還是另有隱情蔬芥,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布控汉,位于F島的核電站笔诵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姑子。R本人自食惡果不足惜乎婿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望街佑。 院中可真熱鬧谢翎,春花似錦捍靠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吊宋,卻和暖如春纲辽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背璃搜。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工拖吼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人这吻。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓吊档,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唾糯。 傳聞我的和親對象是個(gè)殘疾皇子怠硼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容