2009-05-11 10 views
2

Ich habe seit Stunden versucht, viele-zu-viele-Beziehung mit Castle ActiveRecord zu speichern. Was mache ich falsch? Ich kann nichts in der Dokumentation oder bei Google finden. Es gibt Daten in der Datenbank.Fehler: Wie speichert man eine Viele-zu-Viele-Beziehung in Castle Active Record?

Kurse haben eine viel zu viele Beziehung mit Bücher.

Testcode.

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

funktioniert auch nicht

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

Datenbank-Klassen

[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

gleiches Problem, es wird versucht, die Einheit speichern zuerst welche aus feuern eine "Verletzung der UNIQUE KEY constraint" Ich habe alles richtig eingerichtet es scheint ... aus Ideen :( – rball

Antwort

3

sicher, dass Sie die Inverse = true setzen, wo Sie es wollen. Vom Castle AR docs,

Es ist ratsam, eine Seite der Beziehung als Eigentümer zu wählen. Die andere Seite, die nicht beschreibbare, müssen Inverse = True verwenden.

Setzen Sie die Inverse = true auf der anderen Seite der Beziehung, wie folgt aus:

[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 

Sie müssen auch Attribute an die Spitze beider Klassen hinzufügen - im Moment wissen sie nicht, Welchen Tabellen sind sie zugeordnet? Zur Zeit haben Sie diese:

public class Course : ActiveRecordBase<Course> 

Fügen Sie diese (wobei „natürlich“ ist der Name Ihrer Kurstabelle):

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

Nicht sicher, was du meinst. Kurs haben 'inverse = true' und Bücher nicht. Was sind diese" Attribute ", die Sie speak of? – epochwolf

+0

Beachten Sie meine Bearbeitungen oben. Die Castle AR Dokumentation ist eine großartige Quelle, übrigens –

+1

@Gabriel: Ich würde IListverwendenanstelle von IList –