2016-08-23 16 views
1

目的:接続文字列オフに基づいて、エンティティのコンテキストを作成します

使用EFは、APIからのPOSTリクエストからデータを入力します。 POST要求にはconnection stringをと同じ名前のconnection stringとなるenumにマップする「ID」が含まれます。 「基本」contextオブジェクトを作成し、オブジェクトを適切なテーブルに追加します。

注:

私はSqlCommandを使用してこれを行うことができます知っているが、私の代わりにentity frameworkを使用して、それで亀裂を撮りたかったが、私は壁にぶつかります。


私は長年、EFを使用しましたが、私はそれを得ることができるようグローバルとしてこのPOST方法を作りたかったです。このAPIは、さまざまなWebサイトから多数のリクエストを受け付けますが、すべて同じモデルを使用します。各ウェブサイトのPOSTはの別のデータベースにあります(これがリクエストする方法です)。

私が予見する問題は、各「エンティティ」がどのテーブルに含まれているかを知ることです。したがって、1つのタイプがcontext.TABLE.Add(object)の場合、EFはこの "Car"オブジェクトを "Car"テーブルに配置したいことを理解しています(明らかに)。

「グローバル」エンティティを使用してこれを行うことはできますか?

public class DbConnectionNames 
{ 
    public enum DbConnectionStringNames 
    { 
     SocHopeHcpEntities = 1, // "1" is passed into the POST to map 
     XXXXEntities = 2, 
     ...... 
    } 
} 

<add name="SocHopeHcpEntities" connectionString=".........." /> 
<add name="XXXXEntities" connectionString=".........." /> 
..... 

var professional = new Professional 
{ 
    .... 
    .... 
}; 

string connStringContext = Enum.GetName(typeof(DbConnectionNames.DbConnectionStringNames), model.FormId).ToString(); 
string connectionString = ConfigurationManager.ConnectionStrings[connStringContext].ConnectionString; 

using (var context = new ObjectContext(connectionString)) 
{ 
    context.Professionals.Add(professional); // obviously this doesn't work 
    context.SaveChanges(); 
} 

EDIT:

私のEFは、POCOを使用していないが、すでにそもそもDBをオフに基づいています。同一の類似の表を保持するXX個の異なるデータベースが存在する可能性があります。

public partial class SocHopeHcpEntities : DbContext 
{ 
    public SocHopeHcpEntities() 
     : base("name=SocHopeHcpEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<AreasOfWork> AreasOfWorks { get; set; } 
    public virtual DbSet<Professional> Professionals { get; set; } 
} 
+0

「[質問には「タイトルにタグを含める必要がありますか」](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-the-titles)を参照してください。コンセンサスは "いいえ、彼らはすべきではありません"です! –

答えて

1

DavidGの答えは、あなたが扱っているエンティティタイプを知って強く型付けされたコンテキストに接続文字列を渡す方法を示しました。そのコンテキストは、以下に示すように直接使用できるDbContextから継承します。

データベースに固有のコンテキスト 'オブジェクト'を含まない一般的な方法に注目することは重要です。

System.Data.Objects.ObjectContext oc = new System.Data.Objects.ObjectContext("connection string"); 
oc.AddObject("ProfessionalsTable", professional); 

別の例は、DbContext使用されています:

は、例えばObjectContextは、ここで使用されている方法を見てあなたはまた、あなたが挿入するテーブルがわからない場合

System.Data.Entity.DbContext dbc = new DbContext(""); 
dbc.Set(typeof(Professional)).Add(professional); 

一般的なアプローチが優れていますまた、動的に挿入するオブジェクトを作成することもできます。

+1

また、少し見やすい 'dbc.Set ()。Add(professional)'を使うこともできます。 – DavidG

+0

お金 - ありがとう! –

+0

@DavidG、私は同意します、ありがとう! – Mzn

2

あなたはまだProfessionalが何であるかを理解してコンテキストを必要とする:私はすでにYYYEntities.Context.csファイルの自動生成DbContextから継承しています。たとえば、次のように

public class ProfessionalContext : DbContext 
{ 
    public ProfessionalContext(string connectionString) 
     : base(connectionString) 
    { 
     //This line is optional but it prevents initialising the database 
     //every time you connect to a new database 
     Database.SetInitializer<ProfessionalContext>(null); 
    } 

    public DbSet<Professional> Professionals { get; set; } 
} 

そして、このようにそれを使用します。

using (var context = new ProfessionalContext(connectionString)) 
{ 
    context.Professionals.Add(professional); 
    context.SaveChanges(); 
} 
+0

それを感謝します! –

関連する問題