MVC中code first方式开发,数据库的生成与更新

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lisiyi523897080/article/details/86160844

MVC中code first方式开发,数据库的生成与更新

在使用EF的实际编程中我们经常遇到这样的问题:发现实体结构需要新增加一个字段,或者减少一个字段,急需把实体结构修改,并让数据库更新这种修改。在用Model First或者Database First的情况下我们可以通过在实体视图界面下生成更改数据库数据结构的sql语句,然后通过执行这些sql语句来完成数据库的修改。可Code First下应该怎么办呢。

 

其实我们可以通过程序包管理控制台的命令来完成这种修改:

如下面的实体类代码,红底黄字部分是我添加的一个新的字段,现在我需要让数据库也跟着进行改变:

public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public string Author { get; set; }

        public decimal Price {get;set;}

        public List<BookReview> Reviews { get; set; }

    }

首先打开程序包管理控制台:

在程序包管理控制台输入命令:enable-migrations:

可以看到,系统出现提示,大体意思是我的这个程序集中有多个上下文类型(我这是一个做实验的程序集,创建了两个EF上下文类型)。一般情况下不会出现这个提示,一个程序集中有多个上下文类型才会出现这个提示。

出现这种提示之后在提示的命令中选择一个,决定要对哪个上下文类型进行迁移就行了,我选择迁移我的“EF原理探究.BookDb”,那么只需要按照提示急需在程序包管理控制台输入:Enable-Migrations -ContextTypeName EF原理探究.BookDb。

在运行完命令之后就会发现自己的项目文件里面多了一个Migrations文件,下一步我们需要对这个文件进行操作。

打开Migrations文件夹下面的Configuration.cs文件会发现代码如下:

internal sealed class Configuration : DbMigrationsConfiguration<EF原理探究.BookDb>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;

            AutomaticMigrationDataLossAllowed = true;//这是我自己添加的

        }


        protected override void Seed(EF原理探究.BookDb context)
        {
            //  This method will be called after migrating to the latest version.


            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }

我们只需在Configuration类的构造函数里面插入一句:AutomaticMigrationDataLossAllowed = true;就行了。然后在程序包管理控制台输入命令:updata-database就完成了这种修改,当然,很多情况下运行updata-database修改会报错,如果报错我们可以强制运行,只需加上一个参数-force,完整命令:updata-database -force。

这样就代表迁移成功了!

当然,也有朋友喜欢直接更改数据库的方式完成数据库与实体类的统一,但是这有一个问题,如果在更改了实体类之后直接更改数据库,在统计数目的时候,如db.实体类.count();会发现数据不对,制定了新字段的数据会统计不进来,各种问题。

 

 

出自:https://blog.csdn.net/chenguang79/article/details/50847550/

posted @ 2018-08-30 09:35 热爱生活。 阅读(...) 评论(...) 编辑 收藏
展开阅读全文
博主设置当前文章不允许评论。

求助。。Code First 实体更新的问题

03-07

Entity Framework Code First 在添加实体的时候,会去读取实体的构造函数,数据库有多少条记录,就会去执行多少次。。这个问题困扰了我很久,谁能帮解决下吗rn先贴下代码rn[code=csharp]rn using (var db = new TestContext())rn rn var user = db.Set().FirstOrDefault();rn var list = db.Set().ToList();rn var cus = new customer();rn cus.ID = Guid.NewGuid();rn cus.手机号码 = "33338";rn cus.客户姓名 = "test";rn //cus.typelist = new List();rn //foreach (var type in list)rn // cus.typelist.Add(type);rn cus.编辑人 = user;rn cus.编辑日期 = System.DateTime.Now;rn db.Set().Add(cus);rn db.SaveChanges();rn MessageBox.Show("OK!");rn rn[/code]rncustomer中的编辑人是username的外键,如果再添加过程中,给实体的编辑人赋值,在执行db.Set().Add(cus);这句的时候,就会去反复读customer的构造函数。如果不赋值,就不会,执行1次就过了。rn下面贴上左右实体配置的代码rn[code=csharp]rnusing System;rnusing System.Collections.Generic;rnusing System.Linq;rnusing System.Text;rnusing System.Data.Entity.ModelConfiguration;rnusing System.Data.Entity;rnusing System.ComponentModel.DataAnnotations.Schema;rnrnnamespace WindowsFormsApplicationTestrnrn public class TestContext : DbContextrn rnrn public DbSet customerSet get return Set(); rnrn public DbSet customertypeSet get return Set(); rn public DbSet usernameSet get return Set(); rnrn protected override void OnModelCreating(DbModelBuilder modelBuilder)rn rn modelBuilderrn .Configurationsrnrn .Add(new customerTypeConfiguration())rn .Add(new usernameTypeConfiguration())rn .Add(new customertypeTypeConfiguration());rn base.OnModelCreating(modelBuilder);rn rn rnrnrn public class customerTypeConfiguration : EntityTypeConfigurationrn rn public customerTypeConfiguration()rn rn HasKey(u => u.ID);rn Property(u => u.ID)rn .IsRequired()rn .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);rn HasMany(p => p.typelist).WithMany(a => a.customerlist).Map(x =>rn x.ToTable("cus2type").MapLeftKey("cusid").MapRightKey("type"));rn ToTable("customer");rn rn rnrnrn public class usernameTypeConfiguration : EntityTypeConfigurationrn rn public usernameTypeConfiguration()rn rn HasKey(p => p.ID);rnrn Property(p => p.ID)rn .IsRequired()rn .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);rnrn HasMany(p => p.editcustomer).WithRequired(a => a.编辑人).Map(x => x.MapKey("编辑人"));rn ToTable("username");rn rn rnrn public class customertypeTypeConfiguration : EntityTypeConfigurationrn rn public customertypeTypeConfiguration()rn rn HasKey(p => p.ID);rnrn Property(p => p.ID)rn .IsRequired()rn .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);rnrn ToTable("customertype");rn rn rnrn[/code]rnrn[code=csharp]rnusing System;rnusing System.Collections.Generic;rnusing System.Linq;rnusing System.Text;rnrnnamespace WindowsFormsApplicationTestrnrn public class customerrn rn public customer() rnrn #region IEntity Membersrn /// rn /// Gets or sets the ID of the note.rn /// rn public virtual Guid ID get; set; rn #endregionrnrn #region IEquatable Membersrn /// rn /// Returns a value which indicates if the givenrn /// instance is equal to the current rn /// instance.rn /// rn /// The instance to be checked.rn /// True if the given instance is equal to the currentrn /// instance, otherwise, false.rn //public virtual bool Equals(IEntity other)rn //rn // return this.EntityEquals(other);rn //rnrn #endregionrnrn public virtual string 手机号码 get; set; rn public virtual string 客户姓名 get; set; rn public virtual string 性别 get; set; rn public virtual string 地址 get; set; rn public virtual string 籍贯 get; set; rnrn public virtual Nullable 编辑日期 get; set; rn public virtual username 编辑人 get; set; rnrnrnrnrn public virtual ICollection typelist get; set; rnrnrn rnrnrn public class usernamern rn public username() rnrnrn #region IEntity Membersrn /// rn /// Gets or sets the ID of the note.rn /// rn public virtual Guid ID get; set; rn #endregionrnrnrn public virtual string name get; set; rn public virtual string password get; set; rnrn public virtual ICollection editcustomer get; set; rnrn rnrnrn public class customertype rn rn public customertype() rnrn #region IEntity Membersrn /// rn /// Gets or sets the ID of the note.rn /// rn public virtual Guid ID get; set; rn #endregionrnrnrn public virtual string 类型代码 get; set; rn public virtual string 类型名称 get; set; rnrn public virtual ICollection customerlist get; set; rn rnrn[/code]rnrnrn[code=csharp]rnusing System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.Data.Entity;rnusing System.Data.Entity.ModelConfiguration;rnusing System.ComponentModel.DataAnnotations.Schema;rnusing System.Data.Objects;rnusing System.Windows.Forms;rnrnnamespace WindowsFormsApplicationTestrnrn public partial class Form1 : Formrn rn public Form1()rn rn InitializeComponent();rn rnrn private void button1_Click(object sender, EventArgs e)rn rn using (var db = new TestContext())rn rn db.Database.CreateIfNotExists();rn MessageBox.Show("OK");rn rn rnrn private void button2_Click(object sender, EventArgs e)rn rn using (var db = new TestContext())rn rn var user = db.Set().FirstOrDefault();rn var list = db.Set().ToList();rn var cus = new customer();rn cus.ID = Guid.NewGuid();rn cus.手机号码 = "33338";rn cus.客户姓名 = "test";rn //cus.typelist = new List();rn //foreach (var type in list)rn // cus.typelist.Add(type);rn cus.编辑人 = user;rn cus.编辑日期 = System.DateTime.Now;rn db.Set().Add(cus);rn db.SaveChanges();rn MessageBox.Show("OK!");rn rn rn rnrn[/code]rnrnrn有需要demo的可以与我联系下。。上面是些测试数据, 论坛

没有更多推荐了,返回首页