entity framework4:代码优先 – 在另一个模式中创建数据库? MapSingleType?

我有一个数据库,我使用2种不同的模式。 模式就像名称空间(如果我错了,请纠正我)。 这样我有1个db和当前2个模式…所以1个模式中的表可以与其他模式中的表命名相同,因为它们位于不同的模式中。

如何让EF Code首先与不同的模式进行通信而不是默认模式?

是否与MapSingleType和覆盖方法有关,或者我可以做其他事情吗?

任何帮助真的很感激。

您可以实现以下约定:

public class DefaultSchemaConvention : IConfigurationConvention { string defaultSchema; public DefaultSchemaConvention(string defaultSchema) { if (String.IsNullOrWhiteSpace(defaultSchema)) throw new ArgumentException("defaultSchema"); this.defaultSchema = defaultSchema; } void IConfigurationConvention.Apply( Type memberInfo, Func 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(); modelBuilder.Conventions.Add(new DefaultSchemaConvention("TEST")); } 

亚瑟维克斯在这里有一些关于TPTinheritance和多对多关系的附注。

我不知道CodeFirst模型,但“Table”的DataAnnotation包含一个模式选项。 我的代码如下:

  Public Class Product End Class 

这有助于我处理备用架构

下面是一个如何使entity framework使用基于模型名称空间的表模式的示例。 例如,如果你有一个模型RiaLib.Data.Models.Membership.User那么相应的db表将被称为[Membership]。[User]而不是[dbo]。[User]。

 public class DatabaseContext : DbContext { public DbSet Users { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Conventions.Add(new TableSchemaConvention()); base.OnModelCreating(modelBuilder); } } 

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