【问题标题】:LINQ EF7 ASP.NET and many-to-manyLINQ EF7 ASP.NET 和多对多
【发布时间】:2016-03-18 07:14:27
【问题描述】:

如何在 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);
        }

    }

}

文档.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; }

    }
}

【问题讨论】:

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


    【解决方案1】:

    首先,您的控制器不检查 null;如果var ourdoc = db.Documents.FirstOrDefault(p =&gt; 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 链接)。顺便说一句,EF7 还不稳定,所以未来可能会提供这种支持,但目前还没有人知道。

    【讨论】:

    • 方法 .WithMany 显示错误,在 .HasMany 没有 .WithMany 方法。 modelBuilder.Entity() .HasMany(s => s.Persons) .WithMany(c => c.Documents) .Map(cs => { cs.MapLeftKey("Documentid"); cs.MapRightKey ("Personid"); cs.ToTable("DocPer"); });
    • 对不起,我不明白这个问题;你能更具体一点吗?我试过这段代码,看起来不错。你检查过帖子底部的链接吗?
    • 对不起,我的错;看起来 EF7 还不支持多对多,太快了。两个选项:在此处遵循此指南 docs.efproject.net/en/latest/modeling/… 或(最好,EF7 还不稳定)暂时使用 EF6(遵循此:stackoverflow.com/questions/29296073/…
    • 没关系。但是我必须如何向我的多对多表发出请求,以读取、添加和编辑?如下所示不起作用: [HttpPost] public IActionResult addpersons(Person pers) { var ourdoc = db.Documents.FirstOrDefault(p => p.Documentid == docselected); ourdoc.DocPers.Add(ourdoc); db.SaveChanges();返回内容(“s”); }
    • 我更新了答案。 ourdoc.DocPers.Add(ourdoc);必须改为ourdoc.DocPers.Add(new DocPer {Person = person});
    猜你喜欢
    • 2015-04-07
    • 2015-07-04
    • 1970-01-01
    • 2016-09-10
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多