添加对象列表时未保存实体

时间:2019-07-24 05:09:19

标签: c# .net entity-framework repository-pattern db-first

我有一个通过ADO.NET Entity Data Model选项与选项Code First from existing database连接的项目。

我正在尝试从名为CLCAR_MAE_USUARIOS的用户实体创建一条新记录。在业务层中的模型MUsuario上用以下代码创建时,通过映射名为DTOUsuario的用户DTO 使用我的用户实体,然后使用mi用户回购将其保存在我的名为UsuarioRepo的unitOfWOrk中,它没有保存任何内容。没有抛出错误,一切顺利,但是未创建寄存器。

PD:至此,我已经在unitOfWork的调用save方法之前调试了我的实体映射,并且该方法正确且完整,包括了权限列表。

public async Task<DTOUsuario> Guardar(DTOUsuario user)   
{
      bool accion = false;
      crearUsuario(user);
      return user;

}
private void crearUsuario(DTOUsuario user)
{
    CLCAR_MAE_USUARIOS usuario = mapper.Map<DTOUsuario,CLCAR_MAE_USUARIOS>(user);
    unitOfWork.UsuarioRepo.Create(usuario); 
    unitOfWork.Save();
}

我在unitOfWork和saveMethod中的存储库

private UsuarioRepo _UsuarioRepo = null;
public UsuarioRepo UsuarioRepo { get { if (this._UsuarioRepo == null) this._UsuarioRepo = new UsuarioRepo(this.context); return this._UsuarioRepo; } }
private Repository<CLCAR_PERMISOS_ESPECIALES> _PermisosRepo = null;
public Repository<CLCAR_PERMISOS_ESPECIALES> PermisosRepo { get { if (this._PermisosRepo == null) this._PermisosRepo = new Repository<CLCAR_PERMISOS_ESPECIALES>(this.context); return this._PermisosRepo; } }

public async Task Save()
{
    try
    {
        await this.context.SaveChangesAsync(sess);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

但是当我从AutoMapperConfiguration实用工具的属性中忽略渗透列表时,它可以正常工作,则用户实体将得到完美保存。

cfg.CreateMap<DTOUsuario, CLCAR_MAE_USUARIOS>()
                .ForMember(dest => dest.USU_FECHA_CREACION_USUARIO, act => act.Ignore())
                .ForMember(dest => dest.CLCAR_INSPECCION, act => act.Ignore())
                .ForMember(dest => dest.CLCAR_PERFILES, act => act.Ignore())
                .ForMember(dest => dest.CLCAR_SOLICITUD_INSPECCION, act => act.Ignore());
                //.ForMember(dest => dest.CLCAR_PERMISOS_ESPECIALES, act => act.Ignore());

此实体具有权限列表,由称为CLCAR_PERMISOS_ESPECIALES的实体表示。 CLCAR_MAE_USUARIOS实体

public partial class CLCAR_MAE_USUARIOS
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public CLCAR_MAE_USUARIOS()
        {
            CLCAR_INSPECCION = new HashSet<CLCAR_INSPECCION>();
            CLCAR_SOLICITUD_INSPECCION = new HashSet<CLCAR_SOLICITUD_INSPECCION>();
            CLCAR_PERMISOS_ESPECIALES = new HashSet<CLCAR_PERMISOS_ESPECIALES>();
        }

        [Key]
        public int USU_ID { get; set; }

        [Required]
        [StringLength(50)]
        public string USU_USERNAME { get; set; }

        [StringLength(50)]
        public string USU_NOMBRES { get; set; }

        [StringLength(50)]
        public string USU_APELLIDO_PATERNO { get; set; }

        [StringLength(50)]
        public string USU_APELLIDO_MATERNO { get; set; }

        [Required]
        [StringLength(50)]
        public string USU_CLAVE { get; set; }

        public int USU_PERFIL_ID { get; set; }

        public int? USU_RUT { get; set; }

        [StringLength(1)]
        public string USU_DV { get; set; }

        [Column(TypeName = "date")]
        public DateTime USU_FECHA_CREACION_USUARIO { get; set; }

        public bool USU_ACTIVO { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<CLCAR_INSPECCION> CLCAR_INSPECCION { get; set; }

        public virtual CLCAR_PERFILES CLCAR_PERFILES { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<CLCAR_SOLICITUD_INSPECCION> CLCAR_SOLICITUD_INSPECCION { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<CLCAR_PERMISOS_ESPECIALES> CLCAR_PERMISOS_ESPECIALES { get; set; }
    }

我的用户的DTO称为DTOUsuario PD:在此DTO中,我更改了权限列表DTO,因为在此DTO中填充权限列表时,这给了我从对象列表到数组的转换错误< / p>

public class DTOUsuario
    {

        public DTOUsuario()
        {
            //CLCAR_PERMISOS_ESPECIALES = new List<DTOPermisos>();
        }

        public int? USU_ID { get; set; }
        public int? USU_PERFIL_ID { get; set; }
        [MaxLength(20)]
        public string USU_USERNAME { get; set; }
        public bool USU_ACTIVO { get; set; }


        //anexo
        [MaxLength(20)]
        public string USU_CLAVE { get; set; }

        public int USU_RUT { get; set; }

        [MaxLength(1)]
        public string USU_DV { get; set; }
        [MaxLength(30)]
        public string USU_NOMBRES { get; set; }
        [MaxLength(20)]
        public string USU_APELLIDO_PATERNO { get; set; }
        [MaxLength(20)]
        public string USU_APELLIDO_MATERNO { get; set; }

        //public List<DTOPermisos> CLCAR_PERMISOS_ESPECIALES { get; set; }

        public DTOPermisos[] CLCAR_PERMISOS_ESPECIALES { get; set; }

    }

CLCAR_PERMISOS_ESPECIALES实体

public partial class CLCAR_PERMISOS_ESPECIALES
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public CLCAR_PERMISOS_ESPECIALES()
        {
            CLCAR_MAE_USUARIOS = new HashSet<CLCAR_MAE_USUARIOS>();
        }

        [Key]
        public int PESP_ID { get; set; }

        [Required]
        [StringLength(50)]
        public string PESP_NOMBRE { get; set; }

        public int PESP_TIPO { get; set; }

        [Required]
        [StringLength(50)]
        public string PESP_DESCRIPCION { get; set; }

        public int PESP_FUN_ID { get; set; }

        public bool PESP_ACTIVO { get; set; }

        public virtual CLCAR_MAE_FUNCIONALIDAD CLCAR_MAE_FUNCIONALIDAD { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<CLCAR_MAE_USUARIOS> CLCAR_MAE_USUARIOS { get; set; }
    }

DTOPermisos我的权限DTO

public class DTOPermisos
   {

       public int PESP_ID { get; set; }
       [MaxLength(40)]
       public string PESP_NOMBRE { get; set; }
       public int PESP_TIPO { get; set; }
       [MaxLength(150)]
       public string PESP_DESCRIPCION { get; set; }
       public int? PESP_FUN_ID { get; set; }
       public bool PESP_ACTIVO { get; set; }

       public DTOPermisos[] CLCAR_MAE_USUARIOS { get; set; }
       public DTOFuncionalidad CLCAR_MAE_FUNCIONALIDAD { get; set; }

   }

在我的上下文中,两者都有很多对很多的关系

modelBuilder.Entity<CLCAR_MAE_USUARIOS>()
                .HasMany(e => e.CLCAR_PERMISOS_ESPECIALES)
                .WithMany(e => e.CLCAR_MAE_USUARIOS)
                .Map(m => m.ToTable("CLCAR_USUARIOS_PESPECIALES").MapLeftKey("USU_ID").MapRightKey("PESP_ID"));

我应该改变什么?我的头快要爆炸了,请帮忙! 如果您需要任何更多信息,我将关注并上传此帖子。感谢您的关注。

0 个答案:

没有答案