问题
I have a database and i using 2 different schemas. Schemas are like namespaces (correct me if i am wrong). This way i have 1 db and currently 2 schemas... so the tables in 1 schema can be named the same as the tables in the other schema because they are in separate schemas.
How do i get EF Code first to talk to a different schema and not the default schema?
Is it somethign to do with MapSingleType and overriding a method or can i do something else?
ANy help really appreciated.
回答1:
You can implement the following convention:
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);
}
}
Usage:
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"));
}
There is a couple of side notes by Arthur Vickers here concerning TPT inheritance and many-to-many relations.
回答2:
I don't know about the CodeFirst model, but the DataAnnotation for "Table" includes a schema option. My code reads like this:
<Table("Product", Schema:="SalesLT")>
Public Class Product
End Class
This helped me deal with alternate schemas
回答3:
Here is an example how to make entity framework use table schemas based on namespace(s) of your models. For example if you have a model RiaLib.Data.Models.Membership.User
then corresponding db table will be called [Membership].[User] instead of [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
来源:https://stackoverflow.com/questions/4841847/entity-framework-4-code-first-creating-db-in-another-schema-mapsingletype