EF中Code First模式初探
2015-11-11 13:19
369 查看
1.配置实体与数据表的关系
新建一个类:UserConfiguration.cs
2.新建DbContext文件,StewardDataContext.cs,文件继承自:dbContext
此文件夹只需要重写
3.新建数据库初始化配置文件:Configuration.cs
4.新建初始化类:DatabaseInitializer.cs
使用方法,在Global.asax文件,或者Startup.cs文件中调用数据库初始化方法:
页面使用方法:
新建一个类: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(); }
相关文章推荐
- Fragment中super.onResume调用时机
- QT位置相关函数
- 三大WEB服务器对比分析(apache ,lighttpd,nginx)
- MapReduce Map Join 样例
- LeetCode Majority Element II
- 蓝桥杯 算法提高 复数四则运算
- java xml -doc - string 转换
- 辛星浅析vagrant启动异常的一个问题
- AngularJS 中文资料+工具+库+Demo 大搜集
- java虚拟机02-体系结构
- angularJS源码目录结构和文件的解读
- python爬虫(1)
- 动手动脑(因服务器原因无法提交,现在补上)
- asp程序无法上传5M以上的文件
- ActiveMQ VS jBossMQ的选型讨论...
- [LeetCode] Merge Two Sorted Lists
- 二维码扫描
- 学习计划
- HDU 1269 Tarjan
- Sublime 中对 matlab 文件语法高亮(Highlighting)