18

我有一个数据库,我正在使用两种不同的模式。模式就像命名空间(如果我错了,请纠正我)。这样,我有一个数据库和两个模式,因此一个模式中的表可以与另一个模式中的表命名相同,因为它们位于不同的模式中。

如何让 EF 代码首先与不同的架构而不是默认架构交谈?

它与 MapSingleType 和覆盖方法有关还是我可以做其他事情?

4

3 回答 3

10

您可以实现以下约定:

public class DefaultSchemaConvention :
             IConfigurationConvention<Type, EntityTypeConfiguration>
{
    string defaultSchema;
    public DefaultSchemaConvention(string defaultSchema)
    {
        if (String.IsNullOrWhiteSpace(defaultSchema))
            throw new ArgumentException("defaultSchema");
        this.defaultSchema = defaultSchema;
    }

    void IConfigurationConvention<Type, EntityTypeConfiguration>.Apply(
         Type memberInfo, Func<EntityTypeConfiguration> configuration)
    {
      EntityTypeConfiguration cfg = configuration();
      string tableName = cfg.EntitySetName;
      if (String.IsNullOrEmpty(tableName))
          tableName = memberInfo.Name;
      cfg.ToTable(tableName, this.defaultSchema);
    }
}  

用法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.Edm.Db.ColumnTypeCasingConvention>();
    modelBuilder.Conventions.Add(new DefaultSchemaConvention("TEST"));
}  

Arthur Vickers在这里有几个关于 TPT 继承和多对多关系的旁注。

于 2011-01-31T12:00:08.840 回答
7

我不了解 CodeFirst 模型,但“表”的 DataAnnotation 包含一个模式选项。我的代码如下所示:

<Table("Product", Schema:="SalesLT")>
Public Class Product

End Class

这帮助我处理替代模式

于 2012-03-16T19:22:47.267 回答
1

这是一个示例,如何使实体框架根据模型的命名空间使用表模式。例如,如果您有一个模型RiaLib.Data.Models.Membership.User,则相应的数据库表将被称为 [Membership].[User] 而不是 [dbo].[User]。

public class DatabaseContext : DbContext
{
    public DbSet<Membership.User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add(new TableSchemaConvention());

        base.OnModelCreating(modelBuilder);
    }
}

https://github.com/rialib/efextensions > TableSchemaConvention.cs

于 2011-03-03T01:06:04.180 回答