Id的MVC4种子数据库外键

时间:2012-10-12 19:34:44

标签: 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; }
}

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种入餐厅的方式。

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

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

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

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

1 个答案:

答案 0 :(得分: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由上下文设置,并使用与Status相同的ID。

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

修改

请仔细阅读问题的结尾 - 以便回答:

当您创建“新”Status并将其附加到Restaurant时,上下文不知道您要使用"Draft"的现有状态,因此它确实如此你告诉它什么 - 创造一个新的。当您从上下文附加现有Status时,将使用该ID,因为它是相同的实例。