错误:如何在Castle Active Record中保存多对多关系?

时间:2009-05-11 23:21:07

标签: c# castle-activerecord

我已经花了好几个小时来获得与Castle ActiveRecord保存的多对多关系。我究竟做错了什么?我在文档或谷歌上找不到任何东西。数据库中有数据。

课程与书籍之间存在多种关系。

测试代码。

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

也不起作用

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

数据库类

[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; }
    }
}

1 个答案:

答案 0 :(得分:3)

确保将Inverse = true设置为您想要的位置。来自Castle AR docs

  

选择一方是明智的   作为所有者的关系。另一边,   不可写,需要使用   逆=真。

将Inverse = true放在关系的另一端,如下所示:

[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

您还必须在两个类的顶部添加属性 - 目前他们不知道他们映射到哪些表。目前你有这个:

public class Course : ActiveRecordBase<Course>

添加此项(其中“course”是Course表的名称):

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