与 EF 代码第一 1 对多关系作斗争



我希望能够用Category标记我的Movie

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

如果类别不存在,则创建该类别并在 Category c'tor 中调用dbContext.Categories.Add(this)

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

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

编辑:如果我首先使用数据库方法,这将导致具有Movie_IdCategory_IdMovie_Categories表。为什么这如此困难?

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

因此,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;
  }
}

我会以不同的方式构建模型。 将数据库上下文排除在模型之外。

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

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

最终工作的代码

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

最新更新