我是 Entity Framework 5 的新手。我们的团队正在使用Code First
工作流。
在我开始我的主要问题之前,让我首先向您展示我尝试过的东西 (有史以来的终极评论: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 配置/映射属性和类型的文章,但我找不到任何配置来将属性设置为唯一。
所以我为了设置字段唯一所做的就是在创建过程中手动运行几个 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 ...
}
}
我的问题:
- 我对实体框架没有任何配置或数据注释来设置字段唯一性是否正确?
- 有没有办法在运行时检测或知道 EF 是否创建了数据库,以便我可以将此语句移动或隐藏
if (_context.Database.CreateIfNotExists())
到可以覆盖的可用方法中?
我真正想要的是if (_context.Database.CreateIfNotExists())
从 using statemnt 中删除并将其放在其他地方或内部MyDBContext
,这样我的代码将如下所示,
using (MyDBContext _context = new MyDBContext(connString))
{
Account _acc = new Account()
// ...Account properties ...
_context.Account.Add(_acc);
_context.SaveChanges();
}
谢谢。