【发布时间】:2015-12-08 01:03:52
【问题描述】:
我正在尝试在此 EF6-MVC 项目中插入和更新,但我无法正确执行。我真的需要你们的帮助,我将不胜感激。
假设我有这 3 张桌子:
类/表 1:Curso --> CursoId - nombreCurso
类/表 2:Modalidad --> ModalidadId - nombreModalidad
类/表 3:ModalidadCurso --> ModalidadId - CursoId(EF 自动创建)
让我们切入正题,下一个模型(简化版):
public class Curso
{
public int CursoId{ get; set; }
public string nombreCurso { get; set; }
public virtual ICollection<Modalidad> Modalidades { get; set; }
}
public class Modalidad
{
public int ModalidadId{ get; set; }
public string nombreModalidad { get; set; }
public virtual ICollection<Curso> Cursos { get; set; }
}
public class ItehlContext: DbContext
{
public ItehlContext(): base("name=conexionItehl") { }
public DbSet<Curso> Cursos { get; set; }
public DbSet<Modalidad> Modalidades { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Modalidad>()
.HasMany(c => c.Cursos)
.WithMany(i => i.Modalidades)
.Map(t => t.MapLeftKey("codigoModalidad")
.MapRightKey("codigoCurso")
.ToTable("ModalidadCurso"));
}
}
嗯,事情是,我正在尝试做下一件事,EF6 正在创建一个 ModalidadCurso 表,其中保存 ModalidadId 和 CursoId,作为传递类的 FK 的多对多关系。
但是当我尝试创建一个新的 Curso 实体时,我的 MVC-ViewForm 出现问题,因为它没有像预期的那样在 modalidadCurso 实体中创建 ForeignKeys。这几天我一直在研究这个小小的不便,它根本不起作用。
控制器创建 GET/POST
// GET: /Curso/Create
public ActionResult Create()
{
var cursos = new Curso();
cursos.Modalidades = new List<Modalidad>();
ListaModalidadesDropDownList(cursos);
return View();
}
// POST: /Curso/Create
// Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener
// más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="codigoCurso,nombreCurso")] Curso curso)
{
try
{
var nuevaModalidad = new List<Modalidad>();
if (nuevaModalidad != null)
{
foreach (var modalidad in nuevaModalidad)
{
var agregarModalidad = db.Modalidades.Find(modalidad);
curso.Modalidades.Add(agregarModalidad);
}
}
if (ModelState.IsValid)
{
db.Cursos.Add(curso);
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (RetryLimitExceededException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.)
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
ListaModalidadesDropDownList(curso.Modalidades.First().codigoModalidad);
return View(curso);
}
我知道了:
Entity Insert Many-Many-Relationship
它在 Curso Table 中创建实体,没关系。
但是,在 FK-Many Many Relationship-ModalidadCurso 表中,它什么也没做。
我做错了什么??我是 Entity Framework 的初学者,但一切似乎都很好。
感谢您的帮助。
这是 Create.cshtml 文件(简化)
@model ItehlConsulting.Models.Itehl.Curso
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
l.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.nombreCurso, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.nombreCurso)
@Html.ValidationMessageFor(model => model.nombreCurso)
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="codigoModalidad">Modalidad</label>
<div class="col-md-10">
@Html.DropDownList("codigoModalidad", String.Empty)
@Html.ValidationMessageFor(model => model.Modalidades.First().nombreModalidad)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Crear Curso" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
【问题讨论】:
-
您的视图看起来如何?
-
我应该发布所有视图吗?完成 Create.cshtml??
-
看起来您的 opcionModalidades 作为一个空集合回来了。您是否在代码中放置了断点并检查它?
-
Code First 基于命名约定,目前我在这里没有命名约定,但我注意到你的类没有任何数据注释,上次我使用代码优先我在类中使用了数据注释。可能您必须注释类的主键。 entityframeworktutorial.net/code-first/… 多对多关系,我认为它与您所做的 fluent API 正确映射。
-
您将代码中的
opcionModalidades发送到哪里?它不在视图中?
标签: c# asp.net-mvc entity-framework