0

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

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; }
}

现在在表单中我发送包含标签的问题对象。但标签对象仅包含已保存标签的名称和 ID。现在谁能告诉我如何在数据库中插入我的 Question 对象,以便 Question 和 Tag 之间的多对多关系表也可以进入?

编辑 :

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

4

1 回答 1

2

您可以做的是Tag在保存更改之前将您的对象附加到您的上下文中。您可以使用context.Tags.Attach(tag). 这样,Entity Framework 知道您的实体已经存在并且不会尝试插入重复项。

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

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 表中。

于 2013-08-29T10:48:24.377 回答