简单的多对多关系
这是我想要完成的所有案例
- 案例1.文件和类别都是新的
- 案例2。文件不是新的,类别不是新的。
- 案例3.文件是新的,但类别不是新的
- 案例编号 4。文件是新的,但 categirt 不是新的。
案例 1 解决方案:这里一切正常
using (MyContext DbCtx = new MyContext())
{
var FileCategory = new FileCategory {
Active=true,
Category="W",
File = new List<File>()
};
var File = new File
{
FileName = "a",
FileTypeId = 1,
RevisionDate = DateTime.Now,
UploadDate = DateTime.Now,
FileCategory = new List<FileCategory>()
};
DbCtx.FileCategory.Add(FileCategory);
FileCategory.File.Add(File);
DbCtx.SaveChanges();
}
案例 2:我收到一个错误:NullReferenceException (
我认为 MyExistingFile 中的 FileCategory 导航属性为空。不确定延迟加载是否在这里得到了最好的我。
using (MyContext DbCtx = new MyContext())
{
var MyExistingFile = DbCtx.File.Find(1);
var MyExistingCategory = DbCtx.FileCategory.Find(1);
//with the line below i am trying to say we dint change anything on File since it already exist
DbCtx.Entry<File>(MyExistingFile).State = EntityState.Unchanged;
//I am just trying to add the category to a file. Since a file can multiple categories.
MyExistingFile.FileCategory.Add(MyExistingCategory);
DbCtx.SaveChanges();
}
我猜一旦有人告诉我为什么案例 2 是错误的,我将能够解决其余的问题。
更新:Slauma 给出了解决方案
我在我的所有 poco 属性和导航属性中添加了 virtual 像这样
public class FileCategory
{
[Key]
public virtual int FileCategoryId { get; set; }
public virtual string Category { get; set; }
public virtual bool Active { get; set; }
public virtual ICollection<File> File { get; set; }
}
然后我能够写这个,它适用于案例 2
using (MyContext DbCtx = new MyContext())
{
var MyExistingFile = DbCtx.File.Find(1);
var MyExistingCategory = DbCtx.FileCategory.Find(1);
MyExistingFile.FileCategory.Add(MyExistingCategory);
DbCtx.SaveChanges();
}