再开始之前,我们对项目的结构做了一些调整,具体步骤,参考我的劣作小白学习做项目(3)。
今天主要讲解的是如何将我们映射到数据库中的类的某些属性(即数据库的某些列)设置唯一性约束。和如何在创建之初,就进行初始化。
来看我们的项目,我们User这个类想必大家已经很不陌生了,User类中的UserID是主键,肯定是不会重复的了,但是对于其他的一些属性,我们在业务考虑的时候是不是也应该对其有一定的限制呢?比如LoginName这个属性,在我们看来它也应该是唯一的吧,还有PhoneNumber和Email这两个属性,如果我们考虑这两个属性是对用户账户安全的一种保证,那么这两个值应该也是唯一的。那么我们就确定了,除了UserID以外,还有LoginName、PhoneNumber、Email这三个属性也要增加唯一约束。(想明白了怎么实现,不过感觉放在这个位置讲解,确实不合适,我失误了。( ▼-▼ ))
不知道大家对这个类还有没有印象DropCreateOrderDatabaseWithSeedValueAlways,再次抱歉,这个唯一性约束功能的实现和我设想的有些出入。在DropCreateOrderDatabaseWithSeedValueAlways类我们要重写它父类的Seed方法,将我们的唯一约束注册进去。

public class DropCreateOrderDatabaseWithSeedValueAlways : DropCreateDatabaseAlways<BlogContext> { protected override void Seed(BlogContext context) { context.Database.ExecuteSqlCommand("ALTER TABLE UserInfo ADD CONSTRAINT con_Unique_UserInfoes_LoginName UNIQUE (LoginName)"); context.Database.ExecuteSqlCommand("ALTER TABLE UserInfo ADD CONSTRAINT con_Unique_UserInfoes_PhoneNumber UNIQUE (PhoneNumber)"); context.Database.ExecuteSqlCommand("ALTER TABLE UserInfo ADD CONSTRAINT con_Unique_UserInfoes_Email UNIQUE (Email)"); } } }
大家也看到了,这到最后还是调用的sql语句去实现唯一性约束的。(汗颜!)
我们忘记这段的不愉快吧,回过头来看一下BlogContext类内部OnModelCreating方法,我们发现仅针对User一个类的配置就多达5行代码。当代码多了起来,我们便不好进行维护。我们今天便来对OnModelCreating方法内部做一些调整。
EntityConfig这个文件夹,大家不知道有没有印象,这个文件夹就是用来放置我们每个Model文件夹下对应类的配置信息。

public class UserConfig : EntityTypeConfiguration<User> { public UserConfig() { this.ToTable("UserInfo"); this.Property(s => s.Password).IsRequired().HasMaxLength(128); this.Property(s => s.LoginName).IsRequired().HasMaxLength(20); this.Property(s => s.PhoneNumber).HasMaxLength(20); this.Property(s => s.Email).HasMaxLength(128); } }
再回到BlogContext类内部OnModelCreating方法中将我们自定义的配置类注册进去即可
modelBuilder.Configurations.Add(new UserConfig());