我有一个数据库,我正在使用两种不同的模式。模式就像命名空间(如果我错了,请纠正我)。这样,我有一个数据库和两个模式,因此一个模式中的表可以与另一个模式中的表命名相同,因为它们位于不同的模式中。
如何让 EF 代码首先与不同的架构而不是默认架构交谈?
它与 MapSingleType 和覆盖方法有关还是我可以做其他事情?
我有一个数据库,我正在使用两种不同的模式。模式就像命名空间(如果我错了,请纠正我)。这样,我有一个数据库和两个模式,因此一个模式中的表可以与另一个模式中的表命名相同,因为它们位于不同的模式中。
如何让 EF 代码首先与不同的架构而不是默认架构交谈?
它与 MapSingleType 和覆盖方法有关还是我可以做其他事情?
您可以实现以下约定:
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 继承和多对多关系的旁注。
我不了解 CodeFirst 模型,但“表”的 DataAnnotation 包含一个模式选项。我的代码如下所示:
<Table("Product", Schema:="SalesLT")>
Public Class Product
End Class
这帮助我处理替代模式
这是一个示例,如何使实体框架根据模型的命名空间使用表模式。例如,如果您有一个模型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