0

単純な多対多の関係 ここに画像の説明を入力してください

ここで私が達成しようとしているすべてのケース

  • ケース番号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(); 
        }
4

1 に答える 1

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必要がないので、その行を削除しました。

于 2012-11-14T17:53:13.927 に答える