2009-05-11 18 views
2

J'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 trouve rien dans la documentation ou sur google. Il y a des données dans la base de données.Erreurs: Comment enregistrer une relation many-to-many dans Castle Active Record?

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(); 

ne fonctionne pas non plus

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

Ayant même problème, il essaie de sauver la seule entité première qui est mise à feu hors une « violation de contrainte UNIQUE KEY » J'ai tout correctement configuré, il semble ... d'idées :( – rball

Répondre

3

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

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

Mettez 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 tables ils sont mappés. Actuellement, vous avez ceci:

public class Course : ActiveRecordBase<Course> 

Ajouter ce (où « cours » est le nom de votre table de cours):

[ActiveRecord("course")] 
public class Course : ActiveRecordBase<Course> 
+0

Je ne sais pas ce que vous voulez dire. Chaque cours a 'inverse = true' et livres ne fonctionne pas. Quels sont ces « attributs » que vous parler de – epochwolf

+0

Notez mes modifications au-dessus du château AR docs est une grande ressource, btw –

+1

@Gabriel:.. J'utilise IList au lieu de IList –

Questions connexes