[英]Extracting the configuration created by DbContext.OnModelCreating in IDatabaseInitializer
能否访问在IDatabaseInitializer.InitializeDatabase的实现中的DbContext.OnModelCreating的实现期间创建的配置? 给定DbContext的实例,我看不到如何获得该配置。
背景 :
我选择使用Entity Framework 4.1的代码优先功能来实现一个系统,因为它允许我支持多个数据库引擎,例如SQL Server和MySQL。 像大多数应用程序一样,我需要确保某些实体具有唯一的属性。
我没有编码其他SQL语句以生成此处和此处建议的唯一约束的问题 。 但是,我的模型变得越来越大,并且手工编写SQL语句容易出错,因为它根据TPH,TPC,表名和列名对基础物理数据库架构进行了一些假设。 在某些情况下,例如TPH,甚至可能无法添加唯一约束,而不得不使用另一种特定于数据库的方法,例如唯一索引。
我已经开始写以下内容。 想法是遍历配置,找到具有唯一约束的属性,然后调用提供程序特定的方法来添加唯一约束。
public class UniqueAttribute : Attribute
{
readonly List<string> _names = new List<string>();
public UniqueAttribute(params string[] names)
{
_names.AddRange(names);
}
public IEnumerable<string> PropertyNames
{
get
{
return _names;
}
}
}
public class Party
{
/* some properties, like id */
public virtual ICollection<Address> Addresses { get; set; }
}
public class Person : Party
{
/* some properties unique to a person*/
[Unique]
public string UserName { get; set; }
}
public class Address
{
/* properties for addresses */
}
public class SampleDatabaseContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Party>();
modelBuilder.Entity<Person>();
modelBuilder.Entity<Address>();
}
}
public abstract class SampleDatabaseInitializer : IDatabaseInitializer<SampleDatabaseContext>
{
public void InitializeDatabase(SampleDatabaseContext context)
{
/* code to create the database if it doesn't exist */
// TODO: Walk through the context configuration and find "unique" columns
// TODO: For each unique column, call AddUniqueConstraint
}
public abstract void AddUniqueConstraint(SampleDatabaseContext context, params string[] names);
}
class MySqlSampleDatabaseInitializer : SampleDatabaseInitializer
{
public override void AddUniqueConstraint(SampleDatabaseContext context, params string[] names)
{
/* MySQL specific code to add unique constraints */
}
}
class SqlSampleDatabaseInitializer : SampleDatabaseInitializer
{
public override void AddUniqueConstraint(SampleDatabaseContext context, params string[] names)
{
/* Sql Server specific code to add unique constraints */
}
}
class OracleSampleDatabaseInitializer : SampleDatabaseInitializer
{
public override void AddUniqueConstraint(SampleDatabaseContext context, params string[] names)
{
/* Oracle specific code to add unique constraints */
}
}
非常感激。
无法从上下文访问配置。 一旦获得上下文实例配置,就已经对其进行了编译,无法访问其“类”或属性。 编译模型只是用于定义映射的元数据集。 这些元数据不包含有关唯一属性的其他信息。
在这种情况下,您必须使用反射。 只需使用您的实体从装配中加载所有类型,然后查找标记有“唯一”属性的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.