Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在多对多关系中插入数据_C#_Database_Entity Framework - Fatal编程技术网

C# 如何在多对多关系中插入数据

C# 如何在多对多关系中插入数据,c#,database,entity-framework,C#,Database,Entity Framework,我在我的项目中使用代码优先的数据库模型。我陷入了一个多对多关系的问题。以下是我的数据库架构: public class Question { public int Id { get; set; } ..... ....... [CustomRequiredValidation] Public virtual ICollection<Tag> Tags { get; set; } } public class Tag { public int Id { ge

我在我的项目中使用代码优先的数据库模型。我陷入了一个多对多关系的问题。以下是我的数据库架构:

public class Question
{
  public int Id { get; set; }
  .....
  .......

  [CustomRequiredValidation]
  Public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
  public int Id { get; set; }
  public string Name { get; set; }
  public DateTime CreateDate { get; set; }
  public DateTime LastEditDate { get; set; }
  .....
  .......


  Public virtual ICollection<Question> Questions { get; set; }
}
公开课问题
{
公共int Id{get;set;}
.....
.......
[CustomRequiredValidation]
公共虚拟ICollection标记{get;set;}
}
公共类标签
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共日期时间CreateDate{get;set;}
公共日期时间LastEditDate{get;set;}
.....
.......
公共虚拟ICollection问题{get;set;}
}
现在在FormPost中,我将发送包含标记的问题对象。但标记对象只包含已保存标记的名称和id。现在有人能告诉我如何在数据库中插入我的问题对象,以便问题和标记之间的多对多关系表也能得到条目吗

编辑:


我正在导航集合属性(有问题的标记实体)上添加验证属性。这是验证问题标签的正确位置吗

在保存更改之前,您可以将
标记
对象附加到上下文中。您可以使用
context.Tags.Attach(tag)
来实现这一点。这样,实体框架知道您的实体已经存在,并且不会尝试插入重复的实体

下面是一个控制台应用程序,演示了这一点:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;

class Program
{
    static void Main(string[] args)
    {
        using (MyContext ctx = new MyContext())
        {
            ctx.Database.Delete();

            Question q1 = new Question
            {
                Title = "Title1",
                Tags = new List<Tag> 
                    { 
                        new Tag {Name = "Tag1", CreateDate = DateTime.UtcNow, LastEditDate = DateTime.UtcNow },
                        new Tag {Name = "Tag2", CreateDate = DateTime.UtcNow, LastEditDate = DateTime.UtcNow }, 
                        new Tag {Name = "Tag3", CreateDate = DateTime.UtcNow, LastEditDate = DateTime.UtcNow }, 
                    }
            };

            ctx.Questions.Add(q1);
            ctx.SaveChanges();
        }

        Question q2 = new Question
            {
                Title = "Title1",
                Tags = new List<Tag> 
                    { 
                        new Tag {Id = 1, Name = "Tag1"},
                    }
            };

        using (MyContext ctx = new MyContext())
        {
            foreach (Tag t in q2.Tags)
            {
                DbEntityEntry<Tag> entry = ctx.Entry(t);
                if (entry.State == System.Data.EntityState.Detached)
                {
                    ctx.Tags.Attach(t);
                }
            }

            ctx.Questions.Add(q2);
            ctx.SaveChanges();
        }
    }
}

public class Question
{
    public int Id { get; set; }

    public string Title { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime LastEditDate { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Tag> Tags { get; set; }
    public DbSet<Question> Questions { get; set; }
}
使用系统;
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
班级计划
{
静态void Main(字符串[]参数)
{
使用(MyContext ctx=new MyContext())
{
ctx.Database.Delete();
问题q1=新问题
{
Title=“Title1”,
标签=新列表
{ 
新标记{Name=“Tag1”,CreateDate=DateTime.UtcNow,LastEditDate=DateTime.UtcNow},
新标记{Name=“Tag2”,CreateDate=DateTime.UtcNow,LastEditDate=DateTime.UtcNow},
新标记{Name=“Tag3”,CreateDate=DateTime.UtcNow,LastEditDate=DateTime.UtcNow},
}
};
ctx。问题。添加(q1);
ctx.SaveChanges();
}
问题q2=新问题
{
Title=“Title1”,
标签=新列表
{ 
新标记{Id=1,Name=“Tag1”},
}
};
使用(MyContext ctx=new MyContext())
{
foreach(q2中的标签t.标签)
{
DbEntityEntry=ctx.entry(t);
if(entry.State==System.Data.EntityState.Detached)
{
ctx.标签。附加(t);
}
}
ctx。问题。添加(q2);
ctx.SaveChanges();
}
}
}
公开课问题
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection标记{get;set;}
}
公共类标签
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共日期时间CreateDate{get;set;}
公共日期时间LastEditDate{get;set;}
公共虚拟ICollection问题{get;set;}
}
公共类MyContext:DbContext
{
公共DbSet标记{get;set;}
公共数据库集问题{get;set;}
}
运行此控制台应用程序后,您将看到第二个问题和第一个标记之间的新链接被插入到QuestionsTag表中