我希望能够用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_Id
和Category_Id
的Movie_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();
}
}