EF4.1 - Атрибут, оценивающий к нулю во время выполнения - PullRequest
2 голосов
/ 09 октября 2011

Сначала я использую код EF4.1 для создания простого приложения базы данных с бэкэндом SQL CE 4. У меня есть класс Product и класс CallItem, определенные следующим образом:

    class CallItem
    {
        public int id { get; set; }
        public float discount { get; set; } 
        public virtual Product Product { get; set; }
    }

    class Product
    {
        public int id { get; set; }

        public decimal BaseCost { get; set; }
        public int UnitSize { get; set; }
        public bool isWasteOil { get; set; }

        public string Code { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Ingredients { get; set; }
    }

edit - Когда я создаю коллекцию CallItems с помощью запроса LINQ, я не могу получить доступ к атрибутам Продукта, прикрепленным к каждому CallItem, например

var callItems = from ci in context.CallItems select ci;

foreach(CallItem callItem in callItems)
{
    RunSheet nrs = new RunSheet();
    nrs.prodCode = callitem.Product.Code;
}

Опрос базы данных показывает, что Productid в CallItems заполняется. Однако следующая строка генерирует исключение NullReferenceException во время выполнения:

nrs.prodCode = callitem.Product.Code;

Потому что callitem.Product оценивается как ноль. Это как-то связано с отложенной загрузкой и если да, то как я могу решить проблему?

RunSheet - это другой класс, nrs - это экземпляр, атрибут которого 'prodCode', который я хочу заполнить кодом продукта CallItem.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

Из того кода, который вы показали, он должен работать. Вы пробовали явную загрузку?

var callItems = from ci in context.CallItems.Include(c => c.Product) select ci;

foreach(CallItem callItem in callItems)
{
    RunSheet nrs = new RunSheet();
    nrs.prodCode = callitem.Product.Code;
}
0 голосов
/ 09 октября 2011
public class CallItem
    {
        public int Id { get; set; }
        public float Discount { get; set; }
        public virtual Product Product { get; set; }
    }
 public class Product
    {
        public int Id { get; set; }

        public decimal BaseCost { get; set; }
        public int UnitSize { get; set; }
        public bool IsWasteOil { get; set; }

        public string Code { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Ingredients { get; set; }
    }
using (var context = new StackOverFlowContext())
            {
                var p = new Product
                                {
                                    Id = 1,
                                    BaseCost = 200,
                                    Code = "Hola",
                                    Description = "Soe description",
                                    Ingredients = "Some  ingredients",
                                    IsWasteOil = true,
                                     Name = "My Product",
                                     UnitSize = 10

                                };

                var item = new CallItem
                                    {
                                        Id = 101,
                                        Discount = 10,
                                         Product = p
                                    };
                context.CallItems.Add(item);
                context.SaveChanges();
                var result = from temp in context.CallItems
                             select temp;
                Console.WriteLine("CallItem Id"+result.First().Id);
                Console.WriteLine("ProductId"+result.First().Product.Id);
            }

Я написал приведенный выше код со следующим выводом

CallItemId 1
ProductId 1

SQLr Profiler показал это

SELECT TOP (1) 
[c].[Id] AS [Id], 
[c].[Discount] AS [Discount], 
[c].[Product_Id] AS [Product_Id]
FROM [dbo].[CallItems] AS [c]

Это было слишком долго для комментария, поэтому я поместил его здесь.

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