単純な多対多の関係
ここで私が達成しようとしているすべてのケース
- ケース番号1。ファイルとカテゴリの両方が新しい
- ケース番号2。ファイルは新規ではなく、カテゴリは新規ではありません。
- ケース番号3。ファイルは新しいですが、カテゴリは新しいものではありません
- ケース番号4。ファイルは新しいですが、カテゴリは新しいものではありません。
ケース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ナビゲーションプロパティは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が間違っている理由を誰かが教えてくれれば、残りは解決できると思います。
更新:ソリューションはSlaumaによって提供されました
このようなすべての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();
}