CoolStorage не может установить отношение «один к одному»

Проблема в том, что я не могу понять, как сделать отношение OneToOne между двумя объектами таким образом, чтобы первый объект имел ссылку на второй, а второй - на первый. Вот код:

[MapTo("Model")]
public class Model : CSObject<Model, int>
{
    [OneToOne(LocalKey = "ModelID", ForeignKey = "ModelID")]
    public Product Product { get { return (Product)GetField ("Product"); } set { SetField ("Product", value); } } 
}

[MapTo("Product")]
public class Product : CSObject<Product, int>
{
    [OneToOne(LocalKey = "ProductID", ForeignKey = "ProductID")]
    public Model Model { get { return (Model)GetField ("Model"); } set { SetField ("Model", value); } }
}

Дело в том, что когда я создаю продукт и модель и устанавливаю свойство модели «Продукт» в созданное и сохраняю его, свойство продукта «Модель» не устанавливается и остается NULL. Я уже пытался сделать все локальные и внешние ключи для свойств продукта и модели одинаковыми (например, «ModelID»), но это не решило проблему. Каков правильный способ сделать это?

Я предполагаю, что создание одного из них [OneToMany] добьется цели, но вернет коллекцию, в то время как мне нужно, чтобы один объект возвращался свойством.

Обновить

Вот простое решение, которое можно было бы назвать костылем:

[OneToMany]
public CSList<Product> _ProductList { get { return (CSList<Product>)GetField ("_ProductList"); } set { SetField ("_ProductList", value); } }

[NotMapped]
public Product Product {
    get {
        CSList<Product> list = this._ProductList;
        if (list.Count > 0)
            return list [0];
        return null;
    }
    set {
        if (value != null) {
            CSList<Product> list = this._ProductList;
            list.RemoveAll ();
            list.Add (value);
        }
    }
}

person Danchoys    schedule 23.01.2013    source источник


Ответы (1)


Вы можете сделать оба отношения [ManyToOne]. Это будет работать в вашем сценарии.

person Philippe Leybaert    schedule 23.01.2013
comment
Боюсь, это не сработает. Паттерн ManyToOne подразумевает наличие в таблице столбца, который содержит идентификатор Many, равный One. Это означает, что у нас должен быть столбец ProductID в таблице Model и наоборот. Когда мы устанавливаем для свойства Model продукта какую-либо модель, мы обновляем столбец ModelID таблицы Product, но столбец ProductID таблицы Model остается нетронутым. Кроме того, такой подход может привести к ошибкам при попытке сохранения, так как это кажется бесконечным циклом. - person Danchoys; 23.01.2013