2016-10-26 10 views
-1

私は掲示板システムを開発中です(asp.net mvcのトレーニングの一環として)。私はデータモデリングについて基本的な理解を持っていますが、私は自分のモデルを作成した方法を疑うことがあります。コアロジックは、以下のカテゴリのrealty、auto、およびserviceの広告を投稿することです。最初はTPHアプローチを使用しようとしましたが、私のモデルとオートマッパの設定をバインドするという問題に直面しました。今私はゼロまたは1つの関係を使用すると思います。関連エンティティの更新

私が広告モデルを持っている:

public class Ad 
{ 
    public int ID { get; set; } 

    public string Title { get; set; } 

    public string Description { get; set; } 

    public virtual Realty Realty { get; set; } 

    public virtual Auto Auto { get; set; } 

    public virtual Service Service { get; set; } 
} 

不動産:

public class Realty 
{ 
    [Key] 
    [ForeignKey("Ad")] 
    public int AdID { get; set; } 

    public string Type { get; set; } 

    public string NumberOfRooms { get; set; } 

    public virtual Ad Ad { get; set; } 
} 

自動車とサービスモデルがリアルティモデルと同じ外部キーを持っています。

マイデシベルコンテキスト:

public DbSet<Ad> Ads { get; set; } 
public DbSet<Realty> Realties { get; set; } 
public DbSet<Auto> Autos { get; set; } 
public DbSet<Service> Services { get; set; } 

は、私が唯一の関連するモデルとアップデートの広告モデルを必要としています。それは一緒にすべての関連モデルとの広告を掲載することが可能になりますことを、

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create([Bind(Include = "Title,Descirpiton,Realty,Auto,Service")] Ad ad) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Ads.Add(ad); 
     await db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.ID = new SelectList(db.Autos, "AdID", "CarType", ad.ID); 
    ViewBag.ID = new SelectList(db.Realties, "AdID", "Type", ad.ID); 
    ViewBag.ID = new SelectList(db.Services, "AdID", "ServiceType", ad.ID); 
    return View(ad); 
} 

問題:私は、すべての関連のモデルを含んで足場コントローラのアクションを、使用しています。深く潜り込む前に、私はこれを正しい方法でやっていることを確認したかったのです。

ありがとうございました。

+0

これは、Table Per Type(TPT)モデリングの教科書の例のようです。 https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt – Bill

答えて

1

もうすぐです。あなたがしようとしているように見えるものに基づいて、テーブルごとのモデルを使用する必要があります。ベース(Ad)を作成し、それから継承してサブタイプを作成します。

public class Ad 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

[Table("Realty")] 
public class Realty : Ad 
{ 
    public string Type { get; set; } 
    public string NumberOfRooms { get; set; } 
} 

状況は変わりません。作成する広告の種類がわかったら、適切なサブタイプを作成できるようになりました。

var ad = new Realty(); 
ad.Title = "..."; 
ad.Description = "..."; 
ad.Type = "..."; 
ad.NumberOfRooms = "..."; 

コンテキストで特定のタイプを使用して特定の広告タイプを取得できます。

db.Realty.ToList(); 

または、すべての広告を取得して、それらをループするときにタイプを調べることができます。

var ads = db.Ads.ToList(); 

foreach(var ad in ads) 
{ 
    if(ad is Realty) 
     // do Realty stuff 
    else if (ad is Auto) 
     // do Auto stuff 
} 
+0

ありがとう、クレイグ、もう1つの質問。私は適切なサブタイプのための単一の作成アクションを実装したい、ビューのユーザー選択に依存します。どの方向に私が求めるべきですか?ありがとう。 –

+0

私はあなたの質問を本当に理解していません。エンティティークラスを完全に実装したら、コメントで扱うことのできるより詳細な新しい質問を投稿するべきでしょう。 –

関連する問題