如何在EF中全局设置TimeSpan属性的商店类型?

时间:2012-05-30 11:00:35

标签: entity-framework ef-code-first sql-server-ce entity-framework-4.3

我有一个DbContext类,它在OnModelCreating期间向模型构建器添加了各种实体配置。这个上下文在针对SQL Server运行时效果很好,但是针对SQL CE失败,因为某些实体包含TimeSpan属性。

当数据库是SQL CE时,是否可以修改配置,以便在nvarchar(30)期间将存储类型设置为适当的(例如OnModelCreating)?

在我的主要应用程序中,我有一个DbContext,如此:

public class MyDbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new Entity1Config());
        modelBuilder.Configurations.Add(new Entity2Config());
        modelBuilder.Configurations.Add(new Entity3Config());
        // Lots more entity and complex type configurations here.
    }
}

DbContext针对完整的SQL Server运行。在我的测试中,我想针对SQL CE而不是SQL Server Express运行。理想情况下,我想使用约定覆盖有问题的配置或显式覆盖,如下所示:

public class MyTestingDbContext : MyDbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Entity1>()     
            .Property(x => x.Duration)     
            .HasColumnType("nvarchar(30) not null");
    }
}

要清楚,我只对那些不涉及直接修改原始DbContext类或它的实体的解决方案感兴趣。


注意:ModelBuilder中似乎有一个约定已经为MaxLength属性执行SQL CE特定处理,但它主要使用内部类实现。 (Boooo!)

1 个答案:

答案 0 :(得分:0)

您可以通过Fluent Interface配置,同时调用DateTimePropertyConfiguration.HasColumnType Method

        modelBuilder.Entity<MyEntity>()
            .Property(x=> x.Duration)
            .HasColumnType("Varchar(30) NOT NULL");

或通过ColumnAttribute.DbType property