我有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的状态表中生成新行吗?
答案 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,因为它是相同的实例。