2016-09-01 7 views
0

私はかなり簡単だと思っていましたが、難しいと分かっている状況があります。共有エンティティを持つBaseDbContext

私は現在、それを使用する2つの異なるWebアプリケーションを持つ単一のデータベースを持っています。各アプリケーションには、そのアプリケーション専用に使用されるテーブルがありますが、ApplicationUserテーブルなど、いくつかの共有テーブルもあります。

私がしようとしているのは、すべての共有エンティティを持ち、ベースコンテキストから派生したアプリケーション固有のコンテキストを持つベースコンテキストです。アプリケーションコンテキストの場合、多くの共有エンティティは、追加のナビゲーションプロパティを持つ派生したアプリケーション固有のエンティティを持ちます。私は明確にするため説明しようとするでしょう

BaseContext共有ライブラリ内

public class BaseContext : DbContext 
{ 
    public DbSet<ApplicationUser> ApplicationUsers { get; set; } 
} 

App1の

でApp1Context
public class App1Context : BaseContext 
{ 
    public new DbSet<App1User> ApplicationUsers { get; set; } 
} 

public class App1User: ApplicationUser 
{ 
    //Navigation property specific to App1 
    public virtual ICollection<SomeApp1Entity> SomeApp1Entity_Creator { get; set; } 
} 

App2の

でApp2Context
public class App2Context : BaseContext 
{ 
    public new DbSet<App2User> ApplicationUsers { get; set; } 
} 

public class App2User: ApplicationUser 
{ 
    //Navigation property specific to App2 
    public virtual ICollection<SomeApp2Entity> SomeApp2Entity_Creator { get; set; } 
} 

BaseCon textにはApplicationUserのdbsetがあります。

App1Contextには、ApplicationUserから派生したApp1User用のdbsetがあります。

App2Contextには、App2Userのdbsetがあり、これもApplicationUserから派生しています。

App1Userには共有されていないエンティティへのナビゲーションプロパティがあり、App1のみに適用されるため、App固有のユーザーエンティティが必要です。 App2Userでも同じです。

私がBaseContextを必要とする主な理由は、このコンテキストを使用するSharedServiceを持つことができ、CRUD用のすべてのApplicationUserメソッドを持ちます。

私はいくつかのバリエーションを試しましたので、必要に応じてさらに情報を提供することができます。私は試したことすべてを説明しようと思っています。

私は、共有サービスを持つことができるように、私はBaseContextのdbsetが必要であることを知っています。 App1Contextでモデルを構築するとき、私はApp1Userが代わりに使用されると思うので、ApplicationUserを無視しようとしましたが、これはうまくいきません。私がこれをするとき、キーセットがない(キーを持つ基本クラスを無視しているので、派生クラスではそれを選択しないので)。私が無視しないと、弁別者の列についてエラーが出ます。

私の最初の質問は、私はこのアプローチで時間を無駄にしていますか? Entity Framework 6.3でも可能ですか?

可能であれば、解決方法を見つけるためにどうやって別の方法をとることができますか?

また、私は最初にコードを使用していますが、移行について心配する必要はありません。データベースはすでに存在し、データベースへのすべての変更はそこで行われ、それに応じてC#コードで実装されます。

namespace SharedDataContext 
{ 
    public class BaseDbContext : DbContext 
    { 
     public BaseDbContext() : base("CFConnection") 
     { } 

     public DbSet<ApplicationUser> ApplicationUsers { get; set; } 

    } 

    public partial class ApplicationUser 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

そして、2つのアプリケーションを作成しました:SharedDbContext名前空間 -

は、私が別のライブラリに私の共有コンテキストとエンティティを保持:

+0

これは可能ですか? 'public class BaseContext:DbContext {DbSet Users {get;セット; }パブリッククラスApp1Context:BaseContext {}とパブリッククラスApp2Context:BaseContext {} '。通常、Userエンティティからすべてのナビゲーションプロパティを指定しますか?通常、他のエンティティは、UpdatedBy、CreatedByなどのような関係を設定するためにユーザーのナビゲーションプロパティを持っています – Developer

+0

質問をフォーマットすることができればそれは素晴らしいでしょう – Eldho

+0

一般的な基本クラスは機能しますか? 'BaseContext :DbContext where TUser:ApplicationUser'と' App1Context:BaseContext 'となります。 –

答えて

1

私は、これはあなたが探しているものであるかどうかわからないんだけど - WebApplication1とWebApplication2

WebAp plication1 - App1Contextは - App2Context - - 共有ApplicationUserへの外部キー関係で、独自のエンティティの市を持っています

namespace WebApplication2 
{ 
    public class App2Context : BaseDbContext 
    { 
     public DbSet<City> Cities { get; set; } 
    } 

    public class City 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public int ApplicationUserId { get; set; } 
     public ApplicationUser ApplicationUser { get; set; } 
    } 

} 
共有 ApplicationUser

namespace WebApplication1 
{ 
    public class App1Context : BaseDbContext 
    { 
     public DbSet<Country> Countries { get; set; } 
    } 

    public class Country 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public int ApplicationUserId { get; set; } 
     public ApplicationUser ApplicationUser { get; set; } 
    } 
} 

WebApplication1と外部キー関係で、独自のエンティティの国を持っています

WebApplication2のサンプルコントローラと結果:

0共有エンティティの詳細を

結果:

enter image description here

私はむしろ、もう一方の端からそれを照会し、共有のエンティティにコンテキスト関連のナビゲーションを維持していないにを示唆している - あなたは都市をフェッチする必要がある場合「ユーザー1」、ApplicationUserId == 1ためDbSet<City> Citiesを照会(私たちは、私がこの場合に達成するかどうかはわかりませんApplicationUser内部ICollection<City>持っていた場合、これは簡単だっただろう)

の210
+0

モックアップありがとう!私は実際にあなたがしたくないことをやりたいと思っていました。App1のICollectionsをApp1Userに持っています。 App1UserはApplicationUserから派生します。しかし、あなたのように、私はそれがうまくいく方法を確かめていません。それはまっすぐ進むと思われるが、EFはそれを好まない。私はむしろ、もう一方の側から問い合わせる必要がありますが、各アプリケーションの共有コードをすべて繰り返すよりも、提案したとおりに実装して実装します。あなたのお返事ありがとうございました。 – user2023116

関連する問題