2017年10月12日 星期四

How to self-referencing in Entity Framework via Code First

How to self-referencing in Entity Framework via Code First

Environment
- VS 2015 
- MVC 5
- .Net Framework 4.6.1
- Code First
- MS SQL 2012 Server



Model Class
User.cs
public class User
{
 [Index]  
 [Key]      
 public int Id { get; set; }

 [Column(TypeName = "nvarchar")]
 [StringLength(255)]
 [Required]
 public string Name { get; set; }

 [Column(TypeName = "nvarchar")]
 [StringLength(125)]
 [Required]
 public string Login { get; set; }

 [Column(TypeName = "nvarchar")]
 [StringLength(500)]
 [Required]
 public string Password { get; set; }

 [Column(TypeName = "bit")]        
 public bool IsDisabled { get; set; }

 [Column(TypeName = "nvarchar")]
 [StringLength(255)]
 [Required]
 public string Email { get; set; }

 public int FailedLoginAttempts { get; set; }

 public DateTime CreatedOn { get; set; }

 public int? CreatedBy { get; set; }
 public User Creator { get; set; }
 public DateTime ModifiedOn { get; set; }

 public int? ModifiedBy { get; set; }
 public virtual User Modifier { get; set; }

 [Column(TypeName = "bit")]
 public bool IsDeleted { get; set; }
}

Context Class
MyContext.cs
public class MyContext : DbContext
{
  #region Properties

  public DbSet<User> Users { get; set; }

  #endregion

  #region Ctor

  public MyContext() : base("MyContext")
  {
  }

  #endregion

  #region Methods

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
  // Pluralizing
  modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  // lower camelCase
  modelBuilder.Properties().Configure(c =>
  {
   var name = c.ClrPropertyInfo.Name;
   var newName = char.ToLower(name[0]) + name.Substring(1);
   c.HasColumnName(newName);
  });

  // User Table 
  modelBuilder.Entity<User>()
  .HasOptional(e => e.Creator)
  .WithMany()
  .HasForeignKey(m => m.CreatedBy);

  modelBuilder.Entity<User>()
  .HasOptional(e => e.Modifier)
  .WithMany()
  .HasForeignKey(m => m.ModifiedBy);
 }

  #endregion
}

Initializer Class
MyInitializer.cs
public class MyInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<MyContext>
{
 protected override void Seed(MyContext context)
 {
  var systemUser = new User { Name = "System Admin", Login = "System Admin", Password = "1234567890", IsDisabled = false, Email = "admin@admin.com", FailedLoginAttempts = 0, CreatedOn = DateTime.Today, ModifiedOn = DateTime.Today, IsDeleted = false };
  context.Users.Add(systemUser);
  context.SaveChanges();

  var users = new List<User>
  {
   new User { Name = "Sam", Login = "sam", Password = "1234567890", IsDisabled = false, Email = "sam@sam.com", FailedLoginAttempts = 0, Creator=systemUser, CreatedOn = DateTime.Today, Modifier=systemUser, ModifiedOn = DateTime.Today, IsDeleted = false },
   new User { Name = "Peter", Login = "peter", Password = "1234567890", IsDisabled = false, Email = "peter@peter.com", FailedLoginAttempts = 0, Creator=systemUser, CreatedOn = DateTime.Today, Modifier=systemUser, ModifiedOn = DateTime.Today, IsDeleted = false },
  };
  users.ForEach(s => context.Users.Add(s));
  context.SaveChanges();
    
  
 }
}    


Result in SQL Server

沒有留言:

張貼留言