私はかなり簡単だと思っていましたが、難しいと分かっている状況があります。共有エンティティを持つBaseDbContext
私は現在、それを使用する2つの異なるWebアプリケーションを持つ単一のデータベースを持っています。各アプリケーションには、そのアプリケーション専用に使用されるテーブルがありますが、ApplicationUserテーブルなど、いくつかの共有テーブルもあります。
私がしようとしているのは、すべての共有エンティティを持ち、ベースコンテキストから派生したアプリケーション固有のコンテキストを持つベースコンテキストです。アプリケーションコンテキストの場合、多くの共有エンティティは、追加のナビゲーションプロパティを持つ派生したアプリケーション固有のエンティティを持ちます。私は明確にするため説明しようとするでしょう
:
BaseContext共有ライブラリ内
public class BaseContext : DbContext
{
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
}
App1の
でApp1Contextpublic 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の
でApp2Contextpublic 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名前空間 -
は、私が別のライブラリに私の共有コンテキストとエンティティを保持:
これは可能ですか? 'public class BaseContext:DbContext {DbSet Users {get;セット; }パブリッククラスApp1Context:BaseContext {}とパブリッククラスApp2Context:BaseContext {} '。通常、Userエンティティからすべてのナビゲーションプロパティを指定しますか?通常、他のエンティティは、UpdatedBy、CreatedByなどのような関係を設定するためにユーザーのナビゲーションプロパティを持っています –
Developer
質問をフォーマットすることができればそれは素晴らしいでしょう – Eldho
一般的な基本クラスは機能しますか? 'BaseContext:DbContext where TUser:ApplicationUser'と' App1Context:BaseContext 'となります。 –