2017-05-24 30 views
10

Próbujesz zaimplementować ogólne repozytorium na podstawie an article by Chris Pratt, które używa object jako Id (PK).Dlaczego mapowanie obiektu PK zerwanie ExpressMapper?

Wszystko jest w porządku, dopóki nie spróbowałem wykonać jednego z tych obiektów z ExpressMapper.

Więcej kodu poniżej. Ale zasadniczo, gdy próbuję i to zrobić:

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

Daje mi:

No konstruktora bez parametrów zdefiniowanych dla tego obiektu.

Kiedy zmienić właściwość ExampleDataModelId do string lub int to działa dobrze.

Mam googleed around. Nie widzę niczego oczywistego, ale jestem trochę nie na miejscu. Chciałbym wiedzieć:

  • Co to powoduje?

  • Czy mogę to jakoś obejść?

Chciałbym nadal używać obiektu PK i ExpressMapper, o ile jest to możliwe, ponieważ oba pasują do mojego projektu.


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. 
} 

Odpowiedz

2

kiedy robisz new ExampleDataModel(), Próbujesz initalize wystąpienie ExampleDataModel z konstruktora bez parametrów, ale patrząc na swojej klasy, nie ma jednego, dlatego otrzymujesz

No parameterless constructor defined for this object.

należy dodać jeden konstruktora bez parametrów, który wygląda jak ten

ExampleDataModel() 
{ 
//init object 
} 

chociaż nie jestem pewien, jak chcesz zainicjować swój obiekt, więc nie jestem pewien, jak powinien wyglądać twój konstruktor.

+0

Dziękuję i przepraszam za opóźnienie w powrocie. Nie sądzę, że to jest problem z tej okazji. Rozumiem, że C# dodaje domyślny konstruktor bez parametrów do obiektów, chyba że podano parametr z parametrami. Nie wyjaśnia też, w jaki sposób zmiana właściwości Id na "ciąg" rozwiązuje problem, który widzę. –

2

Zmień swoją klasę ExampleDataModel, nie widzę właściwość ID, jak wrócisz this.Id nie ma żadnego odniesienia do tego, także trzeba ciąg właściwość ID że IDataModel<string> siła ty Mam nadzieję, że to pomoże:

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. 
    } 
+0

Dziękuję. Tak mi przykro, miałem tam killer-literówkę. 'ExampleDataModel' dziedziczy po' DataModel '. (Wstawiłem 'IDataModel' zamiast' DataModel '.) Dlatego powinien on odziedziczyć właściwość Id z tego. –

+0

Przyznam ci nagrodę, ponieważ jest to poprawna odpowiedź, biorąc pod uwagę kod, ponieważ został po raz pierwszy przedstawiony.Jeśli masz jakieś sugestie dotyczące zaktualizowanego kodu (w pytaniu), naprawdę bym to docenił. –