繁体   English   中英

提取由IDatabaseInitializer中的DbContext.OnModelCreating创建的配置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM