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