Id的MVC4种子数据库外键

Gra*_*avy 2 c# ef-code-first asp.net-mvc-4

我有2个班级来保存餐馆的数据.

Status.cs

public class Status
{

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

    [Required]
    [DisplayName("Status")]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

我试图将数据播种到数据库中.

首先,我播种状态表,然后我希望种子餐馆表.

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);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它不喜欢我尝试将StatusId = 1种入餐厅的方式.

我知道我可以在新餐厅内创建一个新状态,但是,我已经将状态播种到数据库中.如何设置餐厅的状态以起草???

我每次都必须这样做吗???

new Restaurant { Name = "The Restaurant Name", Email = "email@restaurant.com", Telephone = "012345566787", StatusId = new Status { Name = "Draft"} }
Run Code Online (Sandbox Code Playgroud)

每当我创建一个状态为"草稿"的新餐厅时,这不会在状态表中生成一个名为Status的新行吗?

D S*_*ley 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") }
};
Run Code Online (Sandbox Code Playgroud)

这样StatusID就由上下文设置并使用相同的ID Status.

如果您想通过索引引用列表中的状态(例如statuses[0]for "Draft")也可以; 恕我直言,按名称选择更合适.

编辑

只是阅读你的问题的结尾 - 所以回答:

当您创建"新" Status并将其附加到您Restaurant的上下文时,上下文不知道您要使用现有状态"Draft",因此它会按照您的说法执行 - 创建一个新的状态.当你Status从上下文附加一个现有的时候使用那个ID,因为它是同一个实例.