与EF CodeFirst 1 to Many关系挣扎

时间:2015-04-22 18:05:53

标签: c# entity-framework ef-code-first

我希望能够使用Movie标记Category

public class Movie
{
   public virtual ObservableCollection<Category> Categories { get; set; }

   public void AddCategory(string name)
   {
       using (var dbContext = new MyDbContext())
       {
           var category = dbContext.Categories.SingleOrDefault(x => x.Name == name) ?? new Category(name, dbContext);
           Categories.Add(category);
           dbContext.SaveChanges();
       }
   }
}

public class Category()
{
    public Category(string name, DbContext dbContext)
    {
        Name = name;
        dbContext.Categories.Add(this);
        dbContext.SaveChanges();
    }
}

如果该类别不存在,则会创建该类别,并在dbContext.Categories.Add(this) c

中调用Category

没有错误,但新的Category未保存到我的Movie.Categories

我猜这是因为我的Movie类属于不同的上下文?我不确定如何构建它。

编辑:如果我使用数据库第一种方法,这将导致Movie_Categories表格具有Movie_IdCategory_Id。为什么这么难?

3 个答案:

答案 0 :(得分:1)

我认为你真正想要的是多对多的关系:一部电影可以有很多类别,一类也可以属于很多电影。

因此Category类需要public virtual ICollection<Movie> Movies {get; set; }属性。

您的Movie课程可能如下所示:

public class Movie
{
   public virtual ICollection<Category> Categories { get; set; }

   public void AddCategory(string name)
   {
       using (var dbContext = new MyDbContext())
       {
           // get the movie object from dbContext so that it is attached
           var movie = dbContext.Movies.SingleOrDefault(m => m.Name == Name); // or match Movie by Id instead of Name
           var category = dbContext.Categories.SingleOrDefault(x => x.Name == name) ?? new Category(name);
           movie.Categories.Add(category);

           dbContext.SaveChanges();
       }
   }
}

Category类:

public class Category
{
  public virtual ICollection<Movie>() Movies { get; set; }
  public string Name { get; set;}

  public Category(string name)
  {
    Name = name;
  }

}

答案 1 :(得分:0)

我会以不同的方式构建模型。将dbcontext保留在模型之外。

public class Movie
{
    public string Name { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public string Name {get;set;}
    public virtual ICollection<Movie> Movies {get;set;}
}

请注意,我有一个类别中的电影虚拟集合。正是这个属性和Movie中的虚拟集合设置了多对多的关系。

您可以添加,然后直接将该类别添加到集合中,并调用SaveChanges。

using (var dbContext = new MyDbContext())
{
    var movie = dbContext.Movies.SingleOrDefault(x => x.Name == name);
    movie.Categories.Add(new Category() { Name = "Romance"});
    dbContext.SaveChanges();
}

上面的代码将在模型类之外的某些方法中,可能在您的控制器或业务层中。

答案 2 :(得分:0)

最终正常工作的代码

    public void AddCategory(string name)
    {
        Category category;

        using (var dbContext = new MyDbContext())
            category = dbContext.Categories.SingleOrDefault(x => x.Name == name);

        using (var dbContext = new MyDbContext())
        {
            if (category == null)
                category = new Category(name, dbContext);
            else
                dbContext.Categories.Attach(category);

            var movie = dbContext.Movies.Single(x => x.Id == Id);
            movie.Categories.Add(category);
            dbContext.SaveChanges();
        }
    }