Không thể truyền đối tượng kiểu NHibernate.Collection.Generic.Pers phù hợpGenericBag sang danh sách


85

Tôi có một lớp được gọi là ReportRequest như:

public class ReportRequest
{
    Int32 templateId;
    List<Int32> entityIds;

    public virtual Int32? Id
    {
        get;
        set;
    }

    public virtual Int32 TemplateId
    {
        get { return templateId; }
        set { templateId = value; }
    }

    public virtual List<Int32> EntityIds
    {
        get { return entityIds; }
        set { entityIds = value; }
    }

    public ReportRequest(int templateId, List<Int32> entityIds)
    {
        this.TemplateId = templateId;
        this.EntityIds = entityIds;
    }
}

Nó được ánh xạ bằng Fluent Hibernate như sau:

public class ReportRequestMap : ClassMap<ReportRequest>
{
    public ReportRequestMap()
    {
        Id(x => x.Id).UnsavedValue(null).GeneratedBy.Native();
        Map(x => x.TemplateId).Not.Nullable();            
        HasMany(x => x.EntityIds).Table("ReportEntities").KeyColumn("ReportRequestId").Element("EntityId").AsBag().Cascade.AllDeleteOrphan();
    }
}

Bây giờ, tôi tạo một đối tượng của lớp này như

ReportRequest objReportRequest = new ReportRequest(2, new List<int>() { 11, 12, 15 });

và cố gắng Lưu đối tượng trong cơ sở dữ liệu bằng cách sử dụng

session.Save(objReportRequest);

Tôi gặp lỗi sau: "Không thể truyền đối tượng kiểu 'NHibernate.Collection.Generic.PersistingGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32]'. "

Tôi không chắc mình đã ánh xạ chính xác thuộc tính EntityIds hay chưa. Xin vui lòng hướng dẫn.

Cảm ơn bạn!


bạn có chắc chắn muốn một danh sách các int chứ không phải danh sách các thực thể liên quan không?
Mauricio Scheffer

Câu trả lời:


161

Sử dụng giao diện bộ sưu tập thay vì bộ sưu tập cụ thể, vì vậy NHibernate có thể đưa nó vào triển khai bộ sưu tập của riêng mình.

Trong trường hợp này, hãy sử dụng IList<int>thay vìList<int>


1
Cảm ơn bạn! đã giải quyết vấn đề. Bạn có thể vui lòng giải thích một chút khi bạn nói 'NHibernate có thể tiêm nó bằng cách triển khai bộ sưu tập của riêng mình.'
inutan


2
Liên kết này không còn tồn tại. Một cập nhật hoặc nội dung ngắn gọn sẽ được đánh giá cao.
Noich


2
Tôi bối rối bởi số lượng người trên stackoverflow phàn nàn về các liên kết chết. Không ai nghe nói về archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Mauricio Scheffer

0

Tôi thấy rằng ICollection<T>việc sử dụng hoạt động ở nơi IList<T>không.

Tôi không phải là thuật sĩ NHibernate, nhưng tôi muốn ném xương cho người khác có thể gặp phải vấn đề này.


Nó phụ thuộc vào cách bộ sưu tập của bạn được ánh xạ. Đối với bagbạn có thể sử dụng IList<T>và cho bộ -ISet<T>
La Mã Artiukhin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.