您的位置:首页 > 其它

EF中Code First模式初探

2015-11-11 13:19 369 查看
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: