简单的多对多关系
这是我想要完成的所有案例
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();
}
我认为来自MyExistingFile的FileCategory导航属性为null。不确定延迟加载在这里是最好的我。
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号案例错误的原因后能够解决剩下的问题。
我将虚拟添加到我的所有poco属性和导航属性中,如此
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();
}
答案 0 :(得分:1)
只需创建一个空列表:
using (MyContext DbCtx = new MyContext())
{
var MyExistingFile = DbCtx.File.Find(1);
var MyExistingCategory = DbCtx.FileCategory.Find(1);
MyExistingFile.FileCategory = new List<FileCategory>();
MyExistingFile.FileCategory.Add(MyExistingCategory);
DbCtx.SaveChanges();
}
在这种情况下避免延迟加载实际上更好,因为它会从数据库加载FileCategory
集合。但是你不需要这个集合来创建新的关系。
手动将状态设置为Unchanged
是没有必要的,所以我删除了该行。