[英]How to insert data in many to many relationship
我在我的项目中使用代码第一个数据库模型。 我陷入了多对多的关系插入问题。 这是我的数据库架构:
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; }
}
现在在表单中我发送包含标签的Question对象。 但标记对象仅包含已保存标记的名称和ID。 现在任何人都可以告诉我如何在数据库中插入我的问题对象,以便问题和标签之间的多对多关系表也可以进入?
编辑:
我在导航集合属性( Tags in Question实体 )中添加验证属性。 这是验证问题标签的正确位置吗?
您可以做的是在保存更改之前将Tag
对象附加到上下文中。 您可以使用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; }
}
运行此控制台应用程序后,您将看到第二个问题与第一个标记之间的新链接已插入QuestionsTag表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.