Erreurs: Comment enregistrer un grand nombre à plusieurs dans Castle Active Record?

StackOverflow https://stackoverflow.com/questions/850502

  •  21-08-2019
  •  | 
  •  

Question

Je l'ai essayé pendant des heures pour obtenir de nombreux à-plusieurs pour sauver avec le château ActiveRecord. Qu'est-ce que je fais mal? Je ne peux pas trouver quoi que ce soit dans la documentation ou sur Google. Il existe des données dans la base de données.

Les cours ont une relation plusieurs à plusieurs avec les livres.

Code d'essai.

Database.Course c = new Database.Course();
c.Number = "CS 433";
c.Name = "Databases";
c.Size = 34;
c.Books = Database.Book.FindAll();
c.Save();

Aussi ne fonctionne pas

foreach(Database.Book b in Database.Book.FindAll()){
    c.Books.Add(b);
}

Classes de base de données

[ActiveRecord]
public class Course : ActiveRecordValidationBase<Course>
{
    private int? id;
    private string number;
    private string name;
    private string description;
    private int size; //number of students in class

    //references
    private IList books = new ArrayList();


    public override string ToString()
    {
        return FormattedName;
    }

    public string FormattedName
    {
        get
        {
            return string.Format("{0} - {1}", Number, Name);
        }
    }

    [PrimaryKey]
    public int? Id
    {
        get { return id; }
        set { id = value; }
    }

    [Property, ValidateNonEmpty]
    public string Number
    {
        get { return number; }
        set { number = value; }
    }

    [Property, ValidateNonEmpty]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    [Property(ColumnType="StringClob")]
    public string Description
    {
        get { return description; }
        set { description = value; }
    }

    [Property]
    public int Size
    {
        get { return size; }
        set { size = value; }
    }

    [HasAndBelongsToMany(typeof(Book),
    Table = "BookCourse", ColumnKey = "course_id", ColumnRef = "book_id", Inverse = true)]
    public IList Books
    {
        get { return books; }
        set { books = value; }
    }
}

[ActiveRecord]
public class Book : ActiveRecordValidationBase<Book>
{
    private int? id;
    private string title;
    private string edition;
    private string isbn;
    private bool is_available_for_order;
    //relations
    private IList authors = new ArrayList();
    private IList bookordercount = new ArrayList();
    private IList courses = new ArrayList();
    private Inventory inventory;

    public override string ToString()
    {
        return FormattedName;
    }

    public string FormattedName
    {
        //*
        get {
            string str;
            if (Edition == null || Edition == "")
                str = Title;
            else
                str = string.Format("{0} ({1})", Title, Edition);

            if (Authors.Count != 0)
            {
                return string.Format("{0} by {1}", str, FormattedAuthors);
            }
            else
            {
                return str;
            }
        }
        /*/
        get
        {
            return Title;
        }
        //*/
    }

    public string FormattedAuthors
    {
        get
        {
            if (Authors.Count == 0) return "";

            StringBuilder sb = new StringBuilder();
            int i = 0, end = Authors.Count;
            foreach (Author a in Authors)
            {
                i++;
                sb.Append(a.FormattedName);
                if (i != end) sb.Append("; ");
            }
            return sb.ToString();
        }
    }


    [PrimaryKey]
    public int? Id
    {
        get { return id; }
        set { id = value; }
    }

    [Property, ValidateNonEmpty]
    public string Title
    {
        get { return title; }
        set { title = value; }
    }

    [Property]
    public string Edition
    {
        get { return edition; }
        set { edition = value; }
    }

    [Property, ValidateNonEmpty]
    public string Isbn
    {
        get { return isbn; }
        set { isbn = value; }
    }

    [Property]
    public bool IsAvailableForOrder
    {
        get { return is_available_for_order; }
        set { is_available_for_order = value; }
    }

    //relations

    [HasAndBelongsToMany(typeof(Author),
    Table = "BookAuthor", ColumnKey = "book_id", ColumnRef = "author_id")]
    public IList Authors
    {
        get { return authors; }
        set { authors = value; }
    }

    [HasMany(typeof(BookOrderCount), Table = "BookOrderCounts", ColumnKey = "BookId")]
    public IList BookOrderCount
    {
        get { return bookordercount; }
        set { bookordercount = value; }
    }

    [HasAndBelongsToMany(typeof(Course),
   Table = "BookCourse", ColumnKey = "book_id", ColumnRef = "course_id")]
    public IList Courses
    {
        get { return courses; }
        set { courses = value; }
    }

    [OneToOne]
    public Inventory Inventory
    {
        get { return inventory; }
        set { inventory = value; }
    }
}
Était-ce utile?

La solution

Assurez-vous que vous mettez l'inverse = true où vous le souhaitez. Des Castle AR docs ,

  

Il est sage de choisir un côté de la   relation en tant que propriétaire. L'autre côté,   la non-inscriptible, besoin d'utiliser   Inverse = true.

Mettre l'inverse = true de l'autre côté de la relation, comme ceci:

[HasAndBelongsToMany(typeof(Book),
    Table = "BookCourse", ColumnKey = "course_id", ColumnRef = "book_id")]
    public IList<Book> Books

[HasAndBelongsToMany(typeof(Course),
   Table = "BookCourse", ColumnKey = "book_id", ColumnRef = "course_id", Inverse = true)]
    public IList<Course> Courses

Vous devez également ajouter des attributs au sommet des deux classes - au moment où ils ne savent pas quelles sont les tables qu'ils sont mis en correspondance. Actuellement, vous avez ceci:

public class Course : ActiveRecordBase<Course>

Ajoutez cette (où "cours" est le nom de votre table de cours):

[ActiveRecord("course")]
public class Course : ActiveRecordBase<Course>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top