Коллекции Linq to SQL не заполняются - PullRequest
1 голос
/ 15 января 2010

У меня есть класс Linq to SQL.

В моей базе данных есть отношения один ко многим.

В конструкторе правильно отображаются отношения, и в конструкторе создается свойство EntitySet<>.

Когда я запускаю код, EntitySet<> не заполняется никакими данными, даже если есть связанные записи, они не заполняются в EntitySet<>

Мне не хватает какого-то свойства или параметра? Должен ли я сам написать запрос? Я чувствую, что упускаю что-то очевидное.

Вот код конструктора:

[Association(Name = "Bar_Foo", Storage = "_Foo", ThisKey = "ID", OtherKey = "BarID")]
[DataMember(Order = 15, EmitDefaultValue = false)]
public EntitySet<Foo> Foos
{
    get
    {
        if ((this.serializing && (this._Foo.HasLoadedOrAssignedValues == false)))
        {
            return null;
        }
        return this._Foo;
    }
    set
    {
        this._Foo.Assign(value);
    }
}

Это код, в котором я пытаюсь получить доступ к EntitySet <>:

    partial void OnCreated()
    {
        foreach (Foo foo in Foos)
        {
            foo.DoSomething();
        }
    }

Подробнее о моей ситуации:

Итак, сверху у меня есть класс Bar с коллекцией Foo. То, что я пытаюсь сделать, это передать Bar в пользовательский интерфейс через службу WCF. Вот мой основной сервисный звонок:

public class TheService : ITheService
{
    public List<Bar> GetBars()
    {
        try
        {
            using (var db = new BarDataContext())
            {
                List<Bar> Bars = new List<Bar>();

                Bars = (from B in db.Bars
                            select B).ToList();

                return Bars;
            }
        }
        catch (Exception ex)
        {
            throw new FaultException(ex.Message + " Something in GetBars() Stack Trace: " + ex.StackTrace);
        }
    }
}

В настоящее время, когда служба возвращает Бары, Foos внутри каждого Бара равна нулю.

Если я создаю свойство в Bar, которое смотрит на Foos, я получаю исключение нулевой ссылки.

Я пытаюсь выполнить запрос в методе OnCreated для заполнения Foos, идентификатор текущего бара равен 0.

Обновлен запрос, который все еще не работает:

                using (var ctx = new BarDataContext())
            {
                List<Bar> Bars= new List<Bar>();

                Bars= (from B in ctx.Bars
                             select B).ToList();

                foreach (Bar bar in Bars)
                {
                    bar.Foos= (from B in ctx.Bars
                               where B.ID == bar.ID
                               select B.Foos).SingleOrDefault();
                }

                return Bars;
            }

Этот код генерирует исключение нулевой ссылки, когда я пытаюсь запросить Foos из Bar.

EDIT:

Приведенный выше код волшебным образом перестал генерировать нулевые ссылочные исключения, не знаю почему. Мне интересно, что вам даже не нужно устанавливать bar.Foos в приведенном выше запросе, вы можете поместить запрос Foos в переменную, которая никогда не используется, и она заполнит свойство Bar.Foos только потому, что вы посмотрели на Foos. Напоминает мне о коте Шредингера.

1 Ответ

0 голосов
/ 15 января 2010

Событие OnCreated применяется к одному объекту записи, а не ко всему EntitySet. Он используется в основном для установки значений по умолчанию для свойств.

Если вы хотите получить набор результатов, вам нужно использовать запрос для этого. Например:

var result = Foos.Where(a => a.ID == 7).Single();

Не лямбда-эквивалент будет:

var result = from a in Foos
             where (a => a.ID == 7)
             select a;

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

Вы не можете использовать событие OnCreated для заполнения свойства Foos в Bar по причине, указанной выше. На самом деле вам вообще не нужно вручную заполнять свойство Foos. Если вы правильно определили отношение внешнего ключа в своей базе данных и использовали конструктор моделей для создания DataContext (* .dbml), свойство Foos уже должно быть заполнено при получении Bar. Вам просто нужно получить доступ к свойству Foos из класса Bar:

var result = from a in DataContext.Bar
             where (a => a.ID == 7)
             select a.Foos;

Этот запрос будет извлекать коллекцию Foos, связанных со строкой № 7.

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