18

データベースがあり、2 つの異なるスキーマを使用しています。スキーマは名前空間のようなものです (間違っていたら訂正してください)。このようにして、1 つのデータベースと現在 2 つのスキーマがあるため、1 つのスキーマのテーブルは別のスキーマにあるため、他のスキーマのテーブルと同じ名前を付けることができます。

既定のスキーマではなく、別のスキーマと通信するように最初に EF Code を取得するにはどうすればよいですか?

それは 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"));
}  

ここには、 TPT 継承と多対多の関係に関するArthur Vickers による補足説明がいくつかあります。

于 2011-01-31T12:00:08.840 に答える
7

CodeFirst モデルについてはわかりませんが、"Table" の DataAnnotation にはスキーマ オプションが含まれています。私のコードは次のようになります。

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

End Class

これは、代替スキーマに対処するのに役立ちました

于 2012-03-16T19:22:47.267 に答える
1

モデルの名前空間に基づいてエンティティ フレームワークにテーブル スキーマを使用させる方法の例を次に示します。たとえば、モデルがある場合RiaLib.Data.Models.Membership.User、対応する db テーブルは [dbo].[User] ではなく [Membership].[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 に答える