0

简单的多对多关系 在此处输入图像描述

这是我想要完成的所有案例

  • 案例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(); 
        }
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 回答