Почему отображение объекта PK нарушает ExpressMapper?

Попытка реализовать общий репозиторий на основе статьи Криса Пратта, которая использует object как Id (PK).

Все хорошо, пока я не попытался .Map() одним из этих объектов с ExpressMapper.

Дополнительный код ниже. Но по существу, когда я пытаюсь это сделать:

var dataModel = postedModel.Map(new ExampleDataModel());

Это дает мне:

Нет конструктора без параметров для этого объекта.

Когда я изменяю свойство Id ExampleDataModel на string или int, он отлично работает.

Я искал googled. Я не вижу ничего очевидного, но я немного из глубины. Я хотел бы знать:

  • Что вызывает это?

  • Можно ли как-то обойти его?

Я хотел бы продолжать использовать объект PK и ExpressMapper, если это возможно, потому что они оба подходят для моего проекта просто отлично.


public interface IDataModel
{
    object Id { get; }  
}

public interface IDataModel<PKT> : IDataModel
{
    new PKT Id { get; set; }
}

public abstract class DataModel<PKT> : IDataModel<PKT>
{
    public PKT Id { get; set; }
    object IDataModel.Id
    {
        get { return this.Id; }
    }
}



public class ExampleDataModel : 
    DataModel<string>, 
    IDataModel<string>
{
     public virtual string SomeProperty{ get; set; }

    // etc.
}

Ответ 1

когда вы выполняете new ExampleDataModel(), вы пытаетесь инициализировать экземпляр ExampleDataModel с помощью конструктора без параметров, но, глядя на ваш класс, у вас его нет, почему вы получаете

No parameterless constructor defined for this object.

Вы должны добавить один конструктор без параметров, который выглядит следующим образом

ExampleDataModel()
{
//init object 
}

хотя я не уверен, как вы хотите запустить свой объект, поэтому я не уверен, каким должен быть ваш конструктор.

Ответ 2

Измените класс ExampleDataModel, я не вижу свойство Id, Как вы возвращаете this.Id для этого нет никакой ссылки, также вам нужно свойство идентификатора строки, которое IDataModel<string> заставляет вас я надеюсь, что эта помощь:

 public class ExampleDataModel : IDataModel, IDataModel<string>
    {
        public string Id { get; set; }

        object IDataModel.Id
        {
            get { return this.Id; }
        }

        public virtual string SomeProperty { get; set; }



        // etc.
    }