public class S_User { public S_User(){this.S_Logs = new List<S_Log>();} public long ID { get; set; } public long RoleID { get; set; } public string UserName { get; set; } public string UserPwd { get; set; } public string IsUse{ get; set; } public string Phone{ get; set; } public string Email{ get; set; } public string Remark { get; set; } public virtual S_Role S_Role { get; set; } public virtual ICollection<S_Log> S_Logs { get; set; } }
2. 接下來是日誌類S_Log,與此關聯的對象有S_User,即一條日誌只屬於某一個用戶。所以S_Log的代碼以下:web
public class S_Log { public long ID { get; set; } public long UserID { get; set; } public DateTime OperationDate { get; set; } public string OperationMenu{ get; set; } public string OperationType{ get; set; } public string Detail{ get; set; } public virtual S_User S_User { get; set; } }
3. 接下來是角色類S_Role,與此關聯的對象有S_User和S_Menu,即一個角色能夠包含多個用戶,一個角色用戶能夠操做多個菜單頁面。數據庫
所以S_Role代碼以下:mvc
public class S_Role { public S_Role(){ this.S_Users = new List<S_User>();} public long ID { get; set; } public string RoleName { get; set; } public string Remark { get; set; } public virtual ICollection<S_User> S_Users { get; set; } public virtual ICollection<S_Menu> S_Menus { get; set; } }
4. 接下來是菜單類S_Menu,與此類關聯的對象有S_Role,即一個菜單頁面能夠被多個角色用戶操做。可是S_Menu採用的是樹級結構的方式,app
一個父級菜單包含多個子菜單,一個子菜單隻屬於某一個父級菜單。即子菜單的PID是父級菜單的ID,所以S_Menu的PID因該是S_Menu中IDasp.net
的外鍵,因爲頂級的父級菜單是沒有父級菜單的,因此咱們能夠設置PID爲可空類型,S_Menu的代碼以下:數據庫設計
public class S_Menu { public long ID { get; set; } public string MenuName { get; set; } public string Icon { get; set; } public string Link { get; set; } public string IsUse { get; set; } public int Level { get; set; } public int SerialNO { get; set; } public Nullable<long> PID { get; set; } public string Remark { get; set; } public virtual ICollection<S_Role> S_Roles { get; set; } public virtual S_Menu Parent { get; set; } public virtual ICollection<S_Menu> Children { get; set; } }
5. 接下來是字典類S_TypeInfo,因爲沒有與之關聯的對象,所以,咱們只需簡單定義屬性就能夠呢。S_TypeInfo的代碼以下:ide
public class S_TypeInfo { public long ID { get; set; } public string Type { get; set; } public string Name { get; set; } public string Value { get; set; } public string Remark { get; set; } }
6. 注意:一對多關係中,咱們須要對外鍵的實體進行構造函數進行重載,好比角色中包含多個用戶,public S_Role(){this.S_Users = new 函數
List<S_User>();}。多對多關係就不用進行此操做呢。還有一點就是外鍵必須顯示的設置,好比RoleID。由於後面在Fluent API映射數據時ui
,配置文件中須要用到。this
public class EFDbContext : DbContext { public EFDbContext() : base("EFDbContext") { } public EFDbContext(string nameOrConnectionString) : base(nameOrConnectionString) { } public DbSet<S_Log> S_Logs { get; set; } public DbSet<S_Menu> S_Menus { get; set; } public DbSet<S_Role> S_Roles { get; set; } public DbSet<S_TypeInfo> S_TypeInfos { get; set; } public DbSet<S_User> S_Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new S_LogMap()); modelBuilder.Configurations.Add(new S_MenuMap()); modelBuilder.Configurations.Add(new S_RoleMap()); modelBuilder.Configurations.Add(new S_TypeInfoMap()); modelBuilder.Configurations.Add(new S_UserMap()); modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); //表中都統一設置禁用一對多級聯刪除 modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); //表中都統一設置禁用多對多級聯刪除 base.OnModelCreating(modelBuilder); } }
public class S_UserMap : EntityTypeConfiguration<S_User> { public S_UserMap() { // Primary Key this.HasKey(t => t.ID); // Properties this.Property(t => t.UserName).IsRequired().HasMaxLength(20); this.Property(t => t.UserPwd).IsRequired().HasMaxLength(25); this.Property(t => t.IsUse).IsRequired().HasMaxLength(2); this.Property(t => t.Phone).IsOptional().HasMaxLength(11); this.Property(t => t.Email).IsOptional().HasMaxLength(25); this.Property(t => t.Remark).IsOptional().HasMaxLength(20); // Table & Column Mappings this.ToTable("S_User"); this.Property(t => t.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.UserName).HasColumnName("UserName"); this.Property(t => t.UserPwd).HasColumnName("UserPwd"); this.Property(t => t.IsUse).HasColumnName("IsUse"); this.Property(t => t.Phone).HasColumnName("Phone"); this.Property(t => t.Email).HasColumnName("Email"); this.Property(t => t.Remark).HasColumnName("Remark"); this.Property(t => t.RoleID).HasColumnName("RoleID"); // Relationships this.HasRequired(t => t.S_Role).WithMany(t => t.S_Users).HasForeignKey(d => d.RoleID); } }
public class S_RoleMap : EntityTypeConfiguration<S_Role> { public S_RoleMap() { // Primary Key this.HasKey(t => t.ID); // Properties this.Property(t => t.RoleName).IsRequired().HasMaxLength(20); this.Property(t => t.Remark).IsRequired().HasMaxLength(200); // Table & Column Mappings this.ToTable("S_Role"); this.Property(t => t.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.RoleName).HasColumnName("RoleName"); this.Property(t => t.Remark).HasColumnName("Remark"); // Relationships this.HasMany(t => t.S_Menus) .WithMany(t => t.S_Roles) .Map(m => { m.ToTable("S_RoleMenu"); m.MapLeftKey("RoleID"); m.MapRightKey("MenuID"); }); } }
public class S_MenuMap : EntityTypeConfiguration<S_Menu> { public S_MenuMap() { this.HasKey(t => t.ID); // Properties this.Property(t => t.MenuName).IsRequired().HasMaxLength(20); this.Property(t => t.Icon).IsRequired().HasMaxLength(20); this.Property(t => t.Link).IsRequired().HasMaxLength(20); this.Property(t => t.IsUse).IsOptional().HasMaxLength(2); this.Property(t => t.Remark).IsOptional().HasMaxLength(200); // Table & Column Mappings this.ToTable("S_Menu"); this.Property(t => t.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.MenuName).HasColumnName("MenuName"); this.Property(t => t.Icon).HasColumnName("Icon"); this.Property(t => t.Link).HasColumnName("Link"); this.Property(t => t.IsUse).HasColumnName("IsUse"); this.Property(t => t.Level).HasColumnName("Level"); this.Property(t => t.SerialNO).HasColumnName("SerialNO"); this.Property(t => t.PID).HasColumnName("PID"); this.Property(t => t.Remark).HasColumnName("Remark"); // Relationships this.HasOptional(t => t.Parent) .WithMany(t => t.Children) .HasForeignKey(d => d.PID); } }
public class InitializerUserData : CreateDatabaseIfNotExists<EFDbContext> { protected override void Seed(EFDbContext context) { //添加默認角色 S_Role role = new S_Role(); role.ID = NewID.NewComb(); role.RoleName = "管理員"; role.Remark = "管理系統全部操做"; //添加默認用戶 long RoleID = role.ID; S_User user = new S_User(); user.ID = NewID.NewComb(); user.RoleID = RoleID; user.UserName ="admin"; user.UserPwd=DESEncrypt.Encrypt("123"); user.IsUse="是"; user.Phone="12345678901"; user.Email="demo@hotmail.com"; user.Remark = "系統管理員帳戶"; user.S_Role = role; context.S_Roles.Add(role); context.S_Users.Add(user); context.SaveChanges(); } }
2. DatabaseInitializer的代碼以下:
public static class DatabaseInitializer { public static void Initialize() { Database.SetInitializer(new InitializerUserData()); using (var db = new EFDbContext()) { db.Database.Initialize(false); } } }
3. 注意:數據的初始化有三種方式,本示例選擇CreateDatabaseIfNotExists,也就是若是數據庫不存在咱們就進行建立,若是數據庫存在,
咱們就只能經過數據遷移來進行對數據庫的修改操做。
4. 在web工程的asp.net mvc 項目中的Global.asax添加對Initializer工程的引用,添加對數據庫初始化操做的註冊。以下顯示:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); DatabaseInitializer.Initialize(); } }