AutoMapper.AutoMapperMappingException: Type De Système.Chaîne de " ne pas avoir un constructeur par défaut
Une erreur étrange a commencé à se manifester dans notre code dans la peur de semaine ou deux. Je suis en train d'essayer d'identifier la cause racine de la cartographie de l'échec. La plus intérieure de l'exception elle-même est perplexe: Type 'System.String' does not have a default constructor
Je ne comprends pas ce que l'exception est de me dire. Pouvez-vous expliquer ce qui s'est passé et peut-être comment je pourrais résoudre ce bug?
Le mappeur est utilisé à l'intérieur d'une méthode générique:
public TEntity UpdateWithHistory<TEntity>(TEntity entity, int? entityID, int? interviewID)
where TEntity : class
{
var snapshot = _interviewContext.Find<TEntity>(entityID);
//This is call that fails
var history = Mapper.Map<TEntity, TEntity>(snapshot);
_interviewHistory.Set<TEntity>().Add(history);
MarkModified(entity);
return Mapper.Map(entity, snapshot);
}
Dans le code ci-dessus, l'instantané n'est PAS nulle. La pleine exception:
AutoMapper.AutoMapperMappingException:
Trying to map Recog.Web.Models.InterviewComment to Recog.Web.Models.InterviewComment.
Using mapping configuration for Recog.Web.Models.InterviewComment to Recog.Web.Models.InterviewComment
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
---> AutoMapper.AutoMapperMappingException: Trying to map System.String to System.String.
Using mapping configuration for System.String to System.String
Destination property: Comment
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
---> AutoMapper.AutoMapperMappingException: Trying to map System.String to System.String.
Using mapping configuration for System.String to System.String
Destination property: Comment
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
---> System.ArgumentException: Type 'System.String' does not have a default constructor
at System.Linq.Expressions.Expression.New(Type type)
at AutoMapper.DelegateFactory.CreateCtor(Type type)
at AutoMapper.Mappers.ObjectCreator.CreateObject(Type type)
at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.CreateObject(ResolutionContext context)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.NewObjectPropertyMapMappingStrategy.GetMappedObject(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.Map(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.Mappers.TypeMapMapper.Map(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context)
--- End of inner exception stack trace ---
at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap)
--- End
Le Commentaire de la classe qui est mentionné:
public class InterviewComment
{
[Key]
public int? InterviewCommentID { get; set; }
[ForeignKey("Interview")]
public int? InterviewID { get; set; }
[CodeType(CodeTypeEnum.CommentSection)]
public int? CommentSectionCodeID { get; set; }
[CodeType(CodeTypeEnum.CommentSource)]
public int? CommentSourceCodeID { get; set; }
[Display(Name = "Comment")]
[StringLength(int.MaxValue)]
public string Comment { get; set; }
[Include]
[Association("Interview_1-*_InterviewComment", "InterviewID", "InterviewID", IsForeignKey = true)]
public virtual Interview Interview { get; set; }
[ReadOnly(true)]
[ForeignKey("ModifiedByUser")]
public virtual ApplicationUser ApplicationUser { get; set; }
[ReadOnly(true)]
public string UserName
{
get { return ApplicationUser != null ? ApplicationUser.GetDisplayName() : null; }
}
[ReadOnly(true)]
public int CreatedByUser { get; set; }
[ReadOnly(true)]
public DateTime CreatedDateTime { get; set; }
[ReadOnly(true)]
public int ModifiedByUser { get; set; }
[ReadOnly(true)]
public DateTime ModifiedDateTime { get; set; }
}
Je suis encore à l'examen des récentes s'engage à identifier le changement qui est à l'origine. Aucune information sur l'exception serait grandement apprécié.
Mapper.AssertConfigurationIsValid()
vous dire quelque chose?Bonne idée et je n'avais pas pensé à l'essayer. Cependant, la config est bien valide.
OriginalL'auteur Ed Chapel | 2011-06-06
Vous devez vous connecter pour publier un commentaire.
La cause de l'erreur dans le code qui n'était pas partagée. Nous avons une convention qui a configuré des mappages pour des types spécifiques découvert par le biais de la réflexion. Notre algorithme de manière incorrecte créé une carte pour
string
, en remplaçant le mappage par défaut fournis par AutoMapper.Si jamais vous voyez l'erreur
Type 'System.String' does not have a default constructor
, confirmez votre code n'est pas de créer une carte pourstring
.OriginalL'auteur Ed Chapel
Chaîne de ne pas avoir un constructeur par défaut, qui ne serait pas utile de toute façon comme un string est immuable.
Pour affiner votre problème, quelles sont les données fournies à la méthode. Quelles sont les données que vous essayez-vous à la carte. Quelle est la valeur de la propriété Commentaires dans l'élément que vous tentez de carte?
InterviewComment
avecComment = "Foo"
est passé commeentity
. Aussi,snapshot
est une instance deInterviewComment
provenant de la base de données à l'aide de EF Premier Code oùComment = "Bar"
.Hmmm dans ce cas, je suis perdu. La seule chose que je peux penser à est de, de ce qui se passe si vous créez un non EF classe et de voir ce qui se passe? Ne devrait pas faire une différence, mais la peine de le tester, je suppose
Avez-vous essayé de mapper une entité qui ne proviennent pas de votre contexte (à l'exclusion que comme un problème).
J'ai fait la carte à partir d'un non-proxy élément. Cette entité avait une chaîne nulle et n'a pas subi la même erreur. Cependant, cela a mené à la découverte.
OriginalL'auteur thekip
J'ai eu la même erreur.
Je voulais gamme de cartes de des objets de tableau d'objets
Cette erreur générés
ne possède pas de constructeur par défaut:
Lorsque j'ai mis correctement les types de cartographie, puis d'erreur a disparu.
OriginalL'auteur Juris