4

(見本市での)スタンドのリストと出展者のリストが必要です。

スタンドのリストは出展者のリストとは別のものですが、登録したら、出展者がスタンドを予約できるようにしたいと考えています。

彼らがスタンドを選択/予約すると、ビュー内のスタンドのリストを表示し、それを予約した関連出展者も表示できるようにしたいと考えています。

同様に、別のビューで、出展者と、彼らが予約したスタンドもリストしたいと思います。

だから私は(EF CodeFirstを使用して)1対1の関係を設定しようとしています。

ただし、スタンドまたは出展者のいずれかにコントローラーを追加しようとすると、次のエラーが発生します。

ここに画像の説明を入力

私のモデルは次のとおりです。

 public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public int ExhibitorID { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }

}

 public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string Company { get; set; }
    public int StandID { get; set; }
    public virtual Stand Stand { get; set; }

}

モデルの「仮想」部分と関係があると確信しています。

接続を許可するために、何を更新する必要があるかを誰でも指摘できますか?

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

マーク

4

2 に答える 2

5

EF は、どのエンティティがプリンシパル (親) で、どのエンティティが依存 (子) であるかを認識していません。最初に来る必要があるエンティティのアイテムで外部キーを宣言する必要があります。これは、注釈または流暢なマッピングで行うことができます。

注釈

次の名前空間を追加します。

using System.ComponentModel.DataAnnotations.Schema;

Stand次の注釈を使用してクラスに注釈を付けます。

public class Stand
{
    [ForeignKey("Exhibitor")]
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public int ExhibitorID { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }

}

流暢なマッピング

クラスのOnModelCreatingメソッドをオーバーライドして、以下を含めます。DbContext

modelBuilder.Entity<Stand>()
    .HasOptional(s => s.Exhibitor)
    .WithRequired(e => e.Stand);
于 2012-08-25T14:21:06.190 に答える
3

作成したモデルは、リレーショナル データベースでは使用できません。しばらくStand必要です。_ 循環関係では、どちらのテーブルにも行を挿入できません。ExibitorIdExibitorStandId

Exibitorが複数ある可能性があると仮定し、Standその関係を 1 対多に変換することも 1 つのオプションです。

public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public int? ExhibitorID { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }    
}

public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string Company { get; set; }
    public virtual ICollection<Stand> Stands { get; set; }
}

または、共有主キー マッピングを使用して、関係を 1 対 1 にすることもできます。Standプリンシパル エンティティはどこにありますか。はを PK としてExibitor使用します。StandID

public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }
}

public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string Company { get; set; }
    public virtual Stand Stand { get; set; }
}

Fluent API を使用して関係を構成します。

modelBuilder.Entity<Exibitor>().HasRequired(e => e.Stand)
    .WithOptional(s => s.Exibitor);
于 2012-08-25T14:16:45.713 に答える