MVC中如何为模型属性设置多个值?(Cookie关联Ingredient问题)
我是MVC和SQL管理的新手,现有需求:需为模型的一个属性设置多个值。我创建了Cookie模型和Ingredient模型,一个Cookie由多个Ingredient组成,希望在列表中同时显示Cookie名称及其对应的Ingredient。
以下是我的模型代码:
Cookie模型:
public class Cookie { [Key] public int Id { get; set; } [Required] public string Name { get; set; } [Required] public List<Ingredient> Ingridients { get; set; } public DateTime CreatedDateTime { get; set; } = DateTime.Now; }
Ingredient模型:
public class Ingredient { [Key] public int Id { get; set; } [Required] public string Name { get; set; } }
我原本以为在Cookie模型中添加Ingredients列表属性即可实现,但执行数据库迁移后,Cookie数据表中仅包含Id、Name和CreatedDateTime字段,无法关联多个Ingredient。请问该如何实现一个Cookie关联多个Ingredient?
解决方案
1. 为Ingredient添加外键关联
EF Core需要明确的外键来维护一对多关系。因为一个Cookie对应多个Ingredient,所以要在Ingredient模型中添加指向Cookie的外键和导航属性:
public class Ingredient { [Key] public int Id { get; set; } [Required] public string Name { get; set; } // 外键:关联Cookie的Id public int CookieId { get; set; } // 导航属性:指向所属的Cookie public Cookie Cookie { get; set; } }
2. 修正Cookie模型的拼写错误
你的Cookie模型中列表属性拼写为Ingridients(多了一个d),建议统一改为Ingredients,避免后续查询或视图渲染出错:
public class Cookie { [Key] public int Id { get; set; } [Required] public string Name { get; set; } [Required] public List<Ingredient> Ingredients { get; set; } public DateTime CreatedDateTime { get; set; } = DateTime.Now; }
3. 显式配置DbContext关系(可选但推荐)
如果EF Core未自动识别关系,可在DbContext的OnModelCreating方法中手动配置一对多关联:
public class YourDbContext : DbContext { public DbSet<Cookie> Cookies { get; set; } public DbSet<Ingredient> Ingredients { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Cookie>() .HasMany(c => c.Ingredients) // 一个Cookie对应多个Ingredient .WithOne(i => i.Cookie) // 一个Ingredient属于一个Cookie .HasForeignKey(i => i.CookieId); // 指定外键字段 } }
4. 重新执行数据库迁移
修改模型后,重新生成并应用迁移,更新数据库结构:
Add-Migration AddCookieIngredientRelationship Update-Database
5. 查询时加载关联数据
要在列表中同时显示Cookie和对应的Ingredient,查询时需用Include方法加载关联的Ingredients集合:
// 在Controller中 public IActionResult Index() { var cookies = _context.Cookies.Include(c => c.Ingredients).ToList(); return View(cookies); }
6. 在视图中渲染关联数据
在Razor视图中,通过嵌套循环遍历Cookie及其Ingredients:
@model List<Cookie> <h1>Cookies & Ingredients</h1> <ul> @foreach (var cookie in Model) { <li> <strong>@cookie.Name</strong> <ul> @foreach (var ingredient in cookie.Ingredients) { <li>@ingredient.Name</li> } </ul> </li> } </ul>
内容的提问来源于stack exchange,提问作者davidmark
相关产品推荐
相关产品推荐

