Что не так с этим сопоставлением объектов linqTOsql? - PullRequest
2 голосов
/ 10 сентября 2010

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

[Table]
public class Category
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public Int64 catID { get; set; }
    public Int64 parentCatID { get; set; }
    public string catName { get; set; }
    public string catDescription { get; set; }

    internal EntityRef<IEnumerable<Category>> _category;
    [Association(ThisKey = "parentCatID", Storage = "_category")]
    public IEnumerable<Category> category {
        get { return _category.Entity; }
        set { _category.Entity = value; }
    }
}

Мой fakeRepository определяется следующим образом:

// Fake hardcoded list of categories
private static IQueryable<Category> fakeCategories = new List<Category> {
    new Category { catID = 1, parentCatID = 0, catName = "Root", catDescription = "" },
    new Category { catID = 2, parentCatID = 1, catName = "Category w/subs", catDescription = "" },
    new Category { catID = 3, parentCatID = 1, catName = "Category no subs but now has subs", catDescription = "" },
    new Category { catID = 4, parentCatID = 2, catName = "Zub Cat", catDescription = "" },
    new Category { catID = 5, parentCatID = 2, catName = "Sub Cat", catDescription = "" },
    new Category { catID = 6, parentCatID = 0, catName = "Another Root", catDescription = "" },
    new Category { catID = 7, parentCatID = 0, catName = "Ze German Root", catDescription = "" },
    new Category { catID = 8, parentCatID = 3, catName = "Brand new cats", catDescription = "" },
    new Category { catID = 9, parentCatID = 8, catName = "Brand new cats sub", catDescription = "" },
}.AsQueryable();

Я передаю Category представлению, как это:

Проблема, с которой я сталкиваюсь, заключается в том, что все это компилируется, но я не получаю ничего, кроме корневых категорий.Model[0].category возвращает ноль.

Что не так с моим самоссылающимся объектом?

Редактировать

Интересно, он не работает, потому что у меняКонтекст данных linq-to-sql в моем fakeRepository.Если это так, есть ли способ обойти это?Могу ли я заставить это работать без подключения к базе данных?

Ответы [ 2 ]

1 голос
/ 15 сентября 2010

Да, ты ударил ногтем по голове.Это не работает, потому что вы используете поддельный репозиторий.

Linq-to-Sql выполняет всю проводку за вас и устанавливает связанные коллекции на основе свойств (и их атрибутов), которые вы настроили в своей модели..

Я не знаю, как это сделать без подключения к базе данных, потому что internal EntityRef<IEnumerable<Category>> _category; для меня совершенно чужд - я больше похож на парня модели POCO.

После быстрого поиска в Google я нашел это - Как: сопоставить связи с базой данных (LINQ to SQL)

Не могли бы вы изменить свою модель на:

[Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
public Int64 CatId { get; set; }
[Column]
public Int64 ParentCatId { get; set; }
[Column]
public string CatName { get; set; }
[Column]
public string CatDescription { get; set; }

private EntitySet<Category> _ChildCategories;
[Association(Storage = "_ChildCategories", OtherKey = "ParentCatId")]
public EntitySet<Category> ChildCategories
{
    get { return this._ChildCategories; }
    set { this._ChildCategories.Assign(value); }
}

private EntityRef<Category> _ParentCategory;
[Association(Storage = "_ParentCategory", ThisKey = "ParentCatId")]
public Category ParentCategory
{
    get { return this._ParentCategory.Entity; }
    set { this._ParentCategory.Entity = value; }
}

Сейчаспоскольку ваш ChildCategories относится к типу EntitySet<Category> (который наследуется от IList<T>), вы должны иметь возможность самим создавать поддельные отношения.

Таким образом, вы можете сделать что-то подобное:

private static IQueryable<Category> GetFakeCategories()
{
    var categories = new List<Category> {
        new Category { CatId = 1, ParentCatId = 0, CatName = "Root", CatDescription = "" },
        new Category { CatId = 2, ParentCatId = 1, CatName = "Category w/subs", CatDescription = "" },
        //Blah
        new Category { CatId = 8, ParentCatId = 3, CatName = "Brand new cats", CatDescription = "" },
        new Category { CatId = 9, ParentCatId = 8, CatName = "Brand new cats sub", CatDescription = "" }
    };

    //Loop over the categories to fake the relationships
    foreach (var category in categories)
    {
        category.ChildCategories = new EntitySet<Category>(); //new up the collection
        foreach (var subLoopCategory in categories)
        {
            if (category.ParentCatId == subLoopCategory.CatId)
                category.ParentCategory = subLoopCategory;

            if (category.Id == subLoopCategory.ParentCatId)
                category.ChildCategories.Add(subLoopCategory);
        }
    }
    return categoies.AsQueryable();
}

Это работает в моей голове, по крайней мере ...: -)

HTH,
Charles

EDIT: Re: Комментарий ниже о нулевой ссылкена _childCategories.

Вы можете изменить модель так:

private EntitySet<Category> _ChildCategories = new EntitySet<Category>();
0 голосов
/ 10 сентября 2010

Он должен быть нулевым.Вы получаете все категории, где ParentId = 0 ... и у вас нет ребенка с идентификатором 0. Так что мне кажется правильным.

Он не показывает никаких подкатегорий, посколькуподкатегории, чтобы показать.Попробуйте это:

    IQueryable<Category> cats = genesisRepository.Category
                                                 .Where(x => x.parentCatID != 0)
                                                 .OrderBy(x => x.catName);

parentCatId должен указывать на действительный CatId, чтобы он был подкатегорией.Этот запрос должен получить все категории, которые являются подкатегориями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...