多对多插入更新和删除我完成了部分工作(Code First EF 5.0)

时间:2012-11-14 17:30:14

标签: c# asp.net-mvc entity-framework

简单的多对多关系 enter image description here

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

  • 案例编号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(); 
        }

1 个答案:

答案 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是没有必要的,所以我删除了该行。