我是Entity Framework 5的新手。我们的团队正在使用Code First工作流。
Code First
在开始我的主要问题之前, 让我先向您展示我已经尝试过的东西 ( 所有时间的最终评语:D)。
:D
public class MyDBContext : CDBContext { public MyDBContext() : base(connString) { } public MyDBContext(string connStr) : base(connStr) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // removes some conventions modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); // ........ // model configurations which contains mappings modelBuilder.Configurations.Add(new AccountConfiguration()); // ........ // calls base OnModelCreating base.OnModelCreating(modelBuilder); } // list of all Entity public DbSet<Account> Account { get; set; } }
MyDBContext是我创建的类,该类继承自CBDContext,其中包含重写方法,该类也继承自DBContext。我遇到的问题之一是实体框架无法处理字段唯一性。我已经在他们的站点上阅读了有关使用Fluent API配置/映射属性和类型的文章,但是找不到用于将属性设置为唯一的任何配置。
MyDBContext
CBDContext
DBContext
因此,为了将字段设置为唯一,我要做的是在创建过程中手动运行多个ALTER sql语句,
using (MyDBContext _context = new MyDBContext(connString)) { if (_context.Database.CreateIfNotExists()) { _context.Database.ExecuteSqlCommand("ALTER TABLE Account ADD CONSTRAINT UQ_Account_AccountNumber UNIQUE(AccountNumber)"); _context.Database.ExecuteSqlCommand("ALTER TABLE Account ADD CONSTRAINT UQ_Account_GUID UNIQUE(GUID)"); // .... more on this in the following lines ... } }
我的问题:
if (_context.Database.CreateIfNotExists())
我真正想要的是if (_context.Database.CreateIfNotExists())从使用状态寄存器中删除并将其放置在其他位置或内部,MyDBContext以便我的代码看起来像这样,
using (MyDBContext _context = new MyDBContext(connString)) { Account _acc = new Account() // ...Account properties ... _context.Account.Add(_acc); _context.SaveChanges(); }
谢谢。
如果您不使用(或不能使用)EF迁移,则可以使用此答案中提到的自定义初始化程序。自定义初始化程序将Seed在创建数据库后执行一个方法=仅在数据库不存在时执行一次。如果您需要逐步开发数据库初始化程序本身,将无济于事(这就是迁移的目的)。
Seed