2

我有 2 个保存餐馆数据的类。

状态.cs

public class Status
{

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

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

餐厅.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]for "Draft")引用列表中的状态,也可以;不过,恕我直言,按名称选择更合适。

编辑

只需阅读问题的结尾 - 所以回答这个问题:

当您创建一个“新”Status并将其附加到您的Restaurant时,上下文不知道您要使用 的现有状态"Draft",因此它会按照您告诉它的操作 - 创建一个新状态。当您附加上下文中的现有项时Status,将使用该 ID,因为它是同一个实例。

于 2012-10-12T20:41:08.453 回答