EF中Code First模式初探

1.配置实体与数据表的关系

新建一个类:UserConfiguration.cs

/// <summary>
    /// UserConfiguration
    /// </summary>
    public class UserConfiguration : EntityTypeConfiguration<UserEntity>
    {
        public UserConfiguration()
        {
            //设置映射的表名和所属的架构
            ToTable("User", "dbo");

            //设置主键
            HasKey(item => item.Id);

            //自增长
            Property(item => item.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            设置一对多的关系以及外键(必须存在外键数据)
            //HasMany(item => item.ExtentionList).WithRequired(item => item.User).HasForeignKey(item => item.UserId);

            //设置属性的类型及长度
            Property(item => item.Name).HasColumnType("nvarchar").HasMaxLength(20);
        }
    }

2.新建DbContext文件,StewardDataContext.cs,文件继承自:dbContext

此文件夹只需要重写

OnModelCreating
方法,如下图

    /// <summary>
    /// StewardDataContext
    /// </summary>
    public class StewardDataContext: DbContext
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public StewardDataContext() : base("default")
        {

        }

        /// <summary>
        /// 带参数构造函数
        /// </summary>
        /// <param name="connectionString"></param>
        public StewardDataContext(string connectionString) : base(connectionString)
        {
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //移除一对多的级联删除关系
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            //移除表名复数形式
            modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();

            //配置实体和数据表的关系
            modelBuilder.Configurations.Add(new UserConfiguration());
            modelBuilder.Configurations.Add(new UserExtentionConfiguration());

        }
    }

3.新建数据库初始化配置文件:Configuration.cs

    /// <summary>
    /// 数据库初始化
    /// </summary>
    internal sealed class Configuration : DbMigrationsConfiguration<StewardDataContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;//启用自动迁移
            AutomaticMigrationDataLossAllowed = false;//不允许接受数据丢失的情况,如果存在则抛异常
        }

        protected override void Seed(StewardDataContext context)
        {
            //#region 用户

            用户
            //var user = new List<UserEntity>
            //{
            //    new UserEntity
            //    {
            //        Name =  "管理员"
            //    }
            //};
            //#endregion

            //AddOrUpdate(context, m => m.Name, user.ToArray());

        }

        #region Private

        /// <summary>
        /// 添加更新数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="context"></param>
        /// <param name="exp"></param>
        /// <param name="param"></param>
        private void AddOrUpdate<T>(DbContext context, Expression<Func<T, object>> exp, T[] param) where T : class
        {
            DbSet<T> set = context.Set<T>();
            set.AddOrUpdate(exp, param);
        }

        #endregion
    }

4.新建初始化类:DatabaseInitializer.cs

    /// <summary>
    /// 数据库初始化操作类
    /// </summary>
    public static class DatabaseInitializer
    {
        /// <summary>
        /// 数据库初始化
        /// </summary>
        public static void Initialize()
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<StewardDataContext, Configuration>());
        }
    }

使用方法,在Global.asax文件,或者Startup.cs文件中调用数据库初始化方法:

    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //根据变更,初始化数据库
            DatabaseInitializer.Initialize();
        }
    }

页面使用方法:

            List<UserEntity> list;
            using (var db = new StewardDataContext())
            {
                var ds = db.Set<UserEntity>();
                var user = new UserEntity
                {
                    Name = string.Format("J{0}",
                        new Random(DateTime.Now.ToFileTime().GetHashCode()).Next(0, 999).ToString().PadLeft(3, '0'))
                };
                ds.Add(user);
                db.SaveChanges();

                ViewBag.TotalCount = ds.Count();
                加载本身的数据,以及外键的数据
                //var queryable = ds.AsNoTracking().Include("ExtentionList").OrderByDescending(item => item.Id).Skip(0).Take(10);

                //只加载本身数据,不包含外键的数据
                var queryable = ds.AsNoTracking().OrderByDescending(item => item.Id).Skip(0).Take(10);

                list = queryable.ToList();
            }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值