我希望能够使用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_Id
和Category_Id
。为什么这么难?
答案 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();
}
}