【问题标题】:EF Code First - System.InvalidOperationExceptionEF 代码优先 - System.InvalidOperationException
【发布时间】:2016-11-28 21:42:06
【问题描述】:

我是 EF Code First 的新手,当我尝试实现相同的错误时,如下所示,

操作 - 运行应用程序时:

1.第一次迁移表后,新记录成功插入'GroupPrivileges'。

2.更新“GroupPrivileges”的同一记录时,会引发错误。

3.类似地,当我尝试在“GroupPrivileges”上插入新的第二条记录时,会弹出相同的错误。

错误:

EntityFramework.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:类型的对象 'System.Collections.Generic.List`1[[Dsms.Model.User.GroupModel, Dsms.Model,版本=1.0.0.0,文化=中性,PublicKeyToken=null]]' 不能从 EntityReference 的 Value 属性中设置或删除 类型为“Dsms.Model.User.GroupModel”。

请帮我解决这个问题,我无法更进一步:-(

有了这个,请找到下面的模型和 DBConfig 类。

public abstract class BaseModel
{
    public int DrivingSchoolId { get; set; }
    public int UserId { get; set; }
    public string ExternalId { get; set; }
    [Display(Name = "Active")]
    public bool IsActive { get; set; }
    public int CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
    public int ModifiedBy { get; set; }
    public DateTime ModifiedOn { get; set; }

    public BaseModel()
    {
        IsActive = true;
        CreatedOn = DateTime.Now;
        ModifiedOn = DateTime.Now;
        ExternalId = Guid.NewGuid().ToString("N");    
    }
}

public class GroupModel : BaseModel
{
    [Key]
    public int GroupId { get; set; }

    [Display(Name = "Name")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please fill the 'Name'")]
    [MaxLength(100, ErrorMessage = "Maximum character lenght of 'Name' is 100.")]
    public string Name { get; set; }

    [Display(Name = "Code")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please fill the 'Code'")]
    [MaxLength(15, ErrorMessage = "Maximum character lenght of 'Code' is 15.")]
    public string Code { get; set; }

    [Display(Name = "Description")]
    [DataType(DataType.MultilineText)]
    [MaxLength(500, ErrorMessage = "Maximum character lenght of 'Description' is 500.")]
    public string Description { get; set; }

    //EF Navigation properties starts
    public virtual ICollection<DrivingSchoolModel> DrivingSchools { get; set; }
    public virtual UserGroupModel UserGroup { get; set; }
    public virtual GroupPrivilegeModel GroupPrivilege { get; set; }
}

public class RoleModel : BaseModel
{
    [Key]
    public int RoleId { get; set; }

    [Display(Name = "Name")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please fill the 'Name'")]
    [MaxLength(100, ErrorMessage = "Maximum character lenght of 'Name' is 100.")]
    public string Name { get; set; }

    [Display(Name = "Code")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please fill the 'Code'")]
    [MaxLength(15, ErrorMessage = "Maximum character lenght of 'Code' is 15.")]
    public string Code { get; set; }

    [Display(Name = "Description")]
    [DataType(DataType.MultilineText)]
    [MaxLength(500, ErrorMessage = "Maximum character lenght of 'Description' is 500.")]
    public string Description { get; set; }

    //EF Navigation properties starts
    public virtual GroupPrivilegeModel GroupPrivilege { get; set; }
    public virtual UserRoleModel UserRole { get; set; }        
}

public class GroupPrivilegeModel : BaseModel
{
    [Key]
    public int GroupPrivilegeId { get; set; }

    [Display(Name = "Group")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please select the 'Group'")]
    public int GroupId { get; set; }

    [Display(Name = "Role")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please select the 'Role'")]
    public int RoleId { get; set; }

    //EF Navigation properties starts
    public virtual ICollection<GroupModel> Groups { get; set; }
    public virtual ICollection<RoleModel> Roles { get; set; }
}

    public GroupConfiguration()
    {
        this.ToTable("Groups", DsmsContext.DEFAULT_DB_SCHEMA);

        this.HasKey(g => g.GroupId);

        this.HasRequired(g => g.DrivingSchools).WithMany().HasForeignKey(g => g.DrivingSchoolId);

        this.Property(g => g.ExternalId).HasColumnName("ExternalGroupId").HasMaxLength(50).IsRequired();
        this.Property(g => g.Name).HasMaxLength(100).IsRequired();
        this.Property(g => g.Code).HasMaxLength(15).IsRequired();
        this.Property(g => g.Description).HasMaxLength(500).IsOptional();
        this.Property(g => g.DrivingSchoolId).IsRequired();
        this.Property(g => g.IsActive).IsRequired();
        this.Property(g => g.CreatedBy).IsRequired();
        this.Property(g => g.CreatedOn).IsRequired();
        this.Property(g => g.ModifiedBy).IsOptional();
        this.Property(g => g.ModifiedOn).IsOptional();

        this.Ignore(g => g.UserId);
        this.Ignore(g => g.UserGroup);
        this.Ignore(g => g.GroupPrivilege);
    }

    public RoleConfiguration()
    {
        this.ToTable("Roles", DsmsContext.DEFAULT_DB_SCHEMA);

        this.HasKey(r => r.RoleId);

        this.Property(r => r.ExternalId).HasColumnName("ExternalRoleId").HasMaxLength(50).IsRequired();
        this.Property(r => r.Name).HasMaxLength(100).IsRequired();
        this.Property(r => r.Code).HasMaxLength(15).IsRequired();
        this.Property(r => r.Description).HasMaxLength(500).IsOptional();
        this.Property(r => r.IsActive).IsRequired();
        this.Property(r => r.CreatedBy).IsRequired();
        this.Property(r => r.CreatedOn).IsRequired();
        this.Property(r => r.ModifiedBy).IsOptional();
        this.Property(r => r.ModifiedOn).IsOptional();

        this.Ignore(r => r.DrivingSchoolId);
        this.Ignore(r => r.UserId);
        this.Ignore(r => r.GroupPrivilege);
        this.Ignore(r => r.UserRole);
    }

    public GroupPrivilegeConfiguration()
    {
        this.ToTable("GroupPrivileges", DsmsContext.DEFAULT_DB_SCHEMA);

        this.HasKey(gp => gp.GroupPrivilegeId);

        this.HasRequired(gp => gp.Groups).WithMany().HasForeignKey(gp => gp.GroupId);
        this.HasRequired(gp => gp.Roles).WithMany().HasForeignKey(gp => gp.RoleId);

        this.Property(gp => gp.IsActive).IsRequired();
        this.Property(gp => gp.CreatedBy).IsRequired();
        this.Property(gp => gp.CreatedOn).IsRequired();
        this.Property(gp => gp.ModifiedBy).IsOptional();
        this.Property(gp => gp.ModifiedOn).IsOptional();

        this.Ignore(gp => gp.DrivingSchoolId);
        this.Ignore(gp => gp.UserId);
        this.Ignore(gp => gp.ExternalId);
    }

【问题讨论】:

    标签: c# database entity-framework


    【解决方案1】:

    在您的更新方法中,如果您摆脱 existingRecord 变量并继续使用会更好:

    _contex.Entry(model).State = System.Data.Entity.EntityState.Modified;
    _context.SaveChages();
    

    与插入方法相同:

     _context.GroupePrivilages.Add(model);
     _context.SaveChages();
    

    还有:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2012-05-17
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多