C# 在实体框架6 Jointable中插入/更新多对多

C# 在实体框架6 Jointable中插入/更新多对多,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在尝试在这个EF6-MVC项目中插入和更新,但是我不能正确地完成它。我真的需要你们的帮助,伙计们,我会很感激的 假设我有3张桌子: 类/表1:游标-->游标-nombreCurso 类/表2:Modalidad-->modalidaid-nombreModalidad 类/表3:ModalidadCurso-->ModalidadId-游标(EF自动创建) 让我们直奔主题,下一个模型(简化): 公共类游标 { 公共int游标{get;set;} 公共字符串nombreCurso{get;s

我正在尝试在这个EF6-MVC项目中插入和更新,但是我不能正确地完成它。我真的需要你们的帮助,伙计们,我会很感激的

假设我有3张桌子:

类/表1:游标-->游标-nombreCurso

类/表2:Modalidad-->modalidaid-nombreModalidad

类/表3:ModalidadCurso-->ModalidadId-游标(EF自动创建)


让我们直奔主题,下一个模型(简化):

公共类游标
{
公共int游标{get;set;}
公共字符串nombreCurso{get;set;}
公共虚拟ICollection Modalidades{get;set;}
}
公共级Modalidad
{
public int ModalidadId{get;set;}
公共字符串nombreModalidad{get;set;}
公共虚拟ICollection游标{get;set;}
}
公共类ItehlContext:DbContext
{
public ItehlContext():base(“name=conexionItehl”){}
公共数据库集游标{get;set;}
公共DbSet Modalidades{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity()
.HasMany(c=>c.Cursos)
.有许多(i=>i.Modalidades)
.Map(t=>t.MapLeftKey(“codigoModalidad”)
.MapRightKey(“codigoCurso”)
.ToTable(“ModalidadCurso”);
}
}

问题是,我正在尝试做下一件事,EF6正在创建一个ModalidadCurso表,其中保存ModalidadId和cursoroid,作为传递类的FK的多个关系

但是当我尝试创建一个新的Curso实体时,我的MVC ViewForm中出现了问题,因为它没有像预期的那样在modalidadCurso实体中创建ForeignKey。我已经研究了好几天了,它根本不起作用

控制器创建获取/发布

    // 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);
    }
//获取:/Curso/Create
公共操作结果创建()
{
var Curso=新Curso();
cursos.Modalidades=新列表();
ListAmodidadesDropDownList(光标);
返回视图();
}
//POST:/Curso/Create
//在公共事务的保护下,特别是在教育方面,有着良好的习惯。对位钝器
//más información veahttp://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果创建([Bind(Include=“codigoCurso,nombreCurso”)]Curso-Curso)
{
尝试
{
var nuevaModalidad=新列表();
if(numodalidad!=null)
{
foreach(nuevaModalidad中的var modalidad)
{
var agregarmodidad=db.Modalidades.Find(modalidad);
curso.Modalidades.Add(agregardalidad);
}
}
if(ModelState.IsValid)
{
db.curso.Add(curso);
db.SaveChanges();
返回操作(“索引”);
}
}
捕获(retrylimitexeedexception/*dex*/)
{
//记录错误(取消注释dex变量名,并在此处添加一行以写入日志。)
ModelState.AddModelError(“,”无法保存更改。请重试,如果问题仍然存在,请与系统管理员联系。“);
}
ListAmodidadesDropDownList(curso.Modalidades.First().codigoModalidad);
返回视图(curso);
}
我明白了:

它在Curso表中创建实体,没关系

但是,在FK Many-Many-Relationship-ModalidadCurso表中,它什么都不做

我做错了什么??我是实体框架的初学者,但似乎一切正常

谢谢你的帮助

这是Create.cshtml文件(简化)

@model ItehlConsulting.Models.Itehl.Curso
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
l、 验证摘要(true)
@LabelFor(model=>model.nombreCurso,新的{@class=“controllabel col-md-2”})
@EditorFor(model=>model.nombreCurso)
@Html.ValidationMessageFor(model=>model.nombreCurso)
莫达利达
@DropDownList(“codigoModalidad”,String.Empty)
@Html.ValidationMessageFor(model=>model.Modalidades.First().nombreModalidad)
}
@ActionLink(“返回列表”、“索引”)

在您看来,您正在发送
codigoModalidad
nombreCurso
。您必须将这些值发布到控制器

替换此项:

public ActionResult Create([Bind(Include="codigoCurso,nombreCurso")] Curso curso)
为此:

public ActionResult Create(string nombreCurso, int codigoModalidad)
然后,在控制器操作中,必须创建游标并将其与Modalidad关联:

[HttpPost]
public ActionResult Create(string nombreCurso, int codigoModalidad)
{
    Modalidad modalidad = new Modalidad();
    modalidad.ModalidadId = codigoModalidad;
    //if modalidad already exists in database, and you just want to make a relationship
    ctx.Entry(modalidad).State = EntityState.Unchanged; 
    //if modalidad does not exists in database, and you want to insert it
    //ctx.Entry(modalidad).State = EntityState.Added;

    Curso curso = new Curso();
    curso.nombreCurso = nombreCurso;
    curso.Modalidades.Add(modalidad); //add our existing modalidad to our new course

    ctx.Cursos.Add(curso);
    ctx.SaveChanges();
}
编辑1

内部游标构造函数:

public Curso() 
{
    Modalidades = new HashSet<Modalidad>();   
}
public Modalidad()
{
     Cursos = new HashSet<Curso>();
}
public Curso()
{
Modalidades=新的HashSet();
}
在Modalidad构造函数中:

public Curso() 
{
    Modalidades = new HashSet<Modalidad>();   
}
public Modalidad()
{
     Cursos = new HashSet<Curso>();
}
public Modalidad()
{
Cursos=newhashset();
}

希望有帮助

你的观点如何?我应该发布所有的观点吗??Complete Create.cshtml??看起来您的opcionModalidades将作为一个空集合返回。您是否在代码中放置了断点并检查了它?代码优先基于命名约定,目前我这里没有命名约定,但我注意到您的类没有任何数据注释,上次我使用代码优先时,我在类中使用了数据注释。可能您必须注释类的主键。多对多关系我认为它与fluent API的映射是正确的。您在代码中向何处发送
opcionModalidades
?看不见了?谢谢法比奥,我照你说的做了