2

レストランのデータを保持するクラスが2つあります。

Status.cs

public class Status
{

    [Required]
    public int StatusId { get; set; }

    [Required]
    [DisplayName("Status")]
    public string Name { get; set; }
}

Restaurant.cs

public class Restaurant
{
    public int RestaurantId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    public string Telephone { get; set; }

    [Required]
    public int StatusId { get; set; }



    // NAVIGATION PROPERTIES

    public virtual Status Status { get; set; }
}

データベースにデータをシードしようとしています。

まず、ステータステーブルをシードし、次にレストランテーブルをシードします。

var statuses = new List<Status>
{
    new Status { Name = "Draft" },
    new Status { Name = "Live" },
    new Status { Name = "Invisible" },
    new Status { Name = "Discontinued" }
};
statuses.ForEach(a => context.Statuses.Add(a));

var restaurants = new List<Restaurant> 
{ 
    new Restaurant { Name = "The Restaurant Name", Email = "email@restaurant.com", Telephone = "012345566787", StatusId = 1 }
};
restaurants.ForEach(a=>context.Restaurants.Add(a));

base.seed(context);

StatusId = 1をRestaurantにシードしようとする方法が気に入らないため、これは機能しません。

新しいレストラン内に新しいステータスを作成できることは知っていますが、すでにステータスをデータベースにシードしています。レストランのステータスをドラフトに設定するにはどうすればよいですか?

私は毎回これをしなければなりませんか?

new Restaurant { Name = "The Restaurant Name", Email = "email@restaurant.com", Telephone = "012345566787", StatusId = new Status { Name = "Draft"} }

これにより、ステータスが「ドラフト」の新しいレストランを作成するたびに、ステータステーブルにステータスという新しい行が文字通り生成されませんか?

4

1 に答える 1

8

を設定しないでくださいStatusId、を設定してくださいStatus

var restaurants = new List<Restaurant> 
{ 
    new Restaurant { 
        Name = "The Restaurant Name", 
        Email = "email@restaurant.com", 
        Telephone = "012345566787", 
        Status = statuses.Single(s=>s.Name=="Draft") }
};

このように、StatusIDはコンテキストによって設定され、と同じIDを使用しますStatus

statuses[0]リスト内のステータスをインデックス(たとえば)で参照したい場合"Draft"も機能します。ただし、名前で選択する方が適切です。

編集

あなたの質問の終わりを読んでください-それでそれに答えるために:

「新規」を作成してStatusをにアタッチするとRestaurant、コンテキストはの既存のステータスを使用することを認識しない"Draft"ため、指示どおりに新しいステータスを作成します。コンテキストから既存のものをアタッチするStatusと、同じインスタンスであるため、そのIDが使用されます。

于 2012-10-12T20:41:08.453 に答える