2017-05-24 25 views
10

Cố gắng triển khai kho lưu trữ chung dựa trên an article by Chris Pratt sử dụng object làm Id (PK).Tại sao ánh xạ đối tượng PK phá vỡ ExpressMapper?

Tất cả đều tốt, cho đến khi tôi cố gắng .Map() một trong các đối tượng này với ExpressMapper.

Thêm mã bên dưới. Nhưng về cơ bản, khi tôi cố gắng và làm điều này:

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

Nó mang lại cho tôi:

Không parameterless constructor định nghĩa cho đối tượng này.

Khi tôi thay đổi Id tài sản của ExampleDataModel đến một string hoặc int nó hoạt động tốt.

Tôi đã googled xung quanh. Tôi không thấy bất cứ điều gì rõ ràng, nhưng tôi là một chút ra khỏi chiều sâu của tôi. Tôi muốn biết:

  • Điều gì gây ra điều này?

  • Tôi có thể làm việc vòng bằng cách nào đó không?

Tôi muốn tiếp tục sử dụng đối tượng PK và ExpressMapper nếu có thể vì cả hai đều đang suiting dự án của tôi.


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

Trả lời

2

khi bạn đang làm new ExampleDataModel(), Bạn đang cố gắng initalize một thể hiện của ExampleDataModel với constructor parameterless, nhưng nhìn vào lớp học của bạn, bạn không có một, đó là lý do tại sao bạn đang nhận được

No parameterless constructor defined for this object.

Bạn nên thêm một constructor parameterless, mà trông như thế này

ExampleDataModel() 
{ 
//init object 
} 

mặc dù tôi không chắc chắn cách bạn muốn khởi tạo đối tượng của mình vì vậy tôi không chắc chắn cách trình xây dựng của bạn nên như thế nào.

+0

Cảm ơn và xin lỗi vì sự chậm trễ trong việc quay lại. Tôi không nghĩ đó là vấn đề trong dịp này. Sự hiểu biết của tôi là C# thêm một hàm tạo parameterless mặc định vào các đối tượng trừ khi một tham số được xác định. Nó cũng không giải thích cách thay đổi thuộc tính Id thành 'string' sửa vấn đề tôi đang nắm bắt. –

2

Thay đổi lớp ExampleDataModel của bạn, tôi không nhìn thấy tài sản Id, Làm thế nào bạn quay lại this.Id không có bất kỳ tài liệu tham khảo cho rằng, cũng có thể bạn cần một chuỗi tài sản Id rằng IDataModel<string> lực bạn tôi hy vọng điều này giúp đỡ:

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

Cảm ơn bạn. Tôi rất xin lỗi, tôi đã có một lỗi đánh máy trong đó. 'ExampleDataModel' kế thừa từ' DataModel '. (Tôi đã đặt 'IDataModel' thay vì' DataModel '.) Vì vậy, nó nên kế thừa thuộc tính Id từ đó. –

+0

Tôi đang trao cho bạn tiền thưởng vì đó là câu trả lời hoàn hảo đúng với mã được trình bày lần đầu tiên.Nếu bạn có bất cứ đề nghị liên quan đến mã cập nhật (trong câu hỏi) tôi thực sự đánh giá cao nó. –

Các vấn đề liên quan