LINQ EF7 ASP.NET和多对多

时间:2016-03-18 07:14:28

标签: asp.net-mvc entity-framework linq

如何将记录添加到我的数据库中,在ASP.NET MVC 6中使用多对多关系?

我试过了,但这是错误的

[HttpPost]
public IActionResult addpersons(Person pers)
{
    var ourdoc = db.Documents.FirstOrDefault(p => p.Documentid == docselected);
    ourdoc.DocPers.Add(ourdoc);
    db.SaveChanges();

    return Content("s");
}

我的模型文件列表:

DocContext.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Data.Entity;

namespace TDS_1_ASPNETMVC6.Models
{
    public class DocPer
    {
        public int Documentid { get; set; }
        public Document Document { get; set; }

        public int Personid { get; set; }
        public Person Person { get; set; }
    }

    public class DocContext : DbContext
    {
        public virtual DbSet<Document> Documents { get; set; }
        public virtual DbSet<Person> Persons { get; set; }


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DocPer>()
                .HasKey(t => new   
                {
                    t.Documentid,
                    t.Personid
                });


            modelBuilder.Entity<DocPer>()
                .HasOne(pt => pt.Document) 
                .WithMany(p => p.DocPers)
                .HasForeignKey(pt => pt.Documentid);

            modelBuilder.Entity<DocPer>()
                .HasOne(pt => pt.Person)
                .WithMany(t => t.DocPers)
                .HasForeignKey(pt => pt.Personid);
        }

    }

}

Documents.cs

using System.Collections.Generic;


namespace TDS_1_ASPNETMVC6.Models
{
    public class Document
    {
        public int Documentid { get; set; }
        public string Name { get; set; }
        public string Props { get; set; }


        public List<DocPer> DocPers { get; set; }
    }
}

Person.cs

using System.Collections.Generic;


namespace TDS_1_ASPNETMVC6.Models
{
    public class Person
    {
        public int Personid { get; set; }
        public string Iname { get; set; }
        public string Fname { get; set; }
        public string Oname { get; set; }
        public string Email { get; set; }



        public List<DocPer> DocPers { get; set; }

    }
}

1 个答案:

答案 0 :(得分:1)

首先,你的控制器没有检查null;如果var ourdoc = db.Documents.FirstOrDefault(p => p.Documentid == docselected);为空,该怎么办?所以首先检查null:)

ourdoc.DocPers.Add(ourdoc);也必须更改为ourdoc.DocPers.Add(new DocPer {Person = person});

其次,为了创建多对多,我建议您删除DocPer表并将其映射到“后面”,如下所示:

public class Document
{
    public Document()
    {
        Persons = new List<Person>();
    }

    public int Documentid { get; set; }
    public string Name { get; set; }
    public string Props { get; set; }


    public virtual ICollection<Person> Persons { get; set; }
}

public class Person
{
    public Person()
    {
        Documents = new List<Document>();
    }

    public int Personid { get; set; }
    public string Iname { get; set; }
    public string Fname { get; set; }
    public string Oname { get; set; }
    public string Email { get; set; }

    public virtual ICollection<Document> Documents { get; set; }

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Document>()
                .HasMany<Person>(s => s.Persons)
                .WithMany(c => c.Documents)
                .Map(cs =>
                {
                    cs.MapLeftKey("Documentid");
                    cs.MapRightKey("Personid");
                    cs.ToTable("DocPer");
                });
}

DocPer表将由EF管理而不会暴露它。查看this网站了解更多详情。本指南仅适用于EF6,而不适用于EF7(不支持多对多,支持检查this链接)。 BTW,EF7仍然不稳定,未来可能会提供这种支持,但还没有人知道。