Проблема с обновлением изменений в LINQ - PullRequest
0 голосов
/ 11 июля 2010

У меня проблема с обновлением базы данных. Приложение показывает обновленное значение, а база данных - нет. Ошибки не возвращены. У моего стола есть ПК. Использование DotConnect для Oracle, но синтаксис LINQ тот же.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataContext DB = 
              new DataContext("User Id=...Password=...;Server=...;");

            DB.Log = Console.Out;
            Console.WriteLine();

            IEnumerable<Foodorder> fo = from f in DB.Foodorders
                       where f.Orderid == 10210
                       select f;
            foreach (Foodorder food in fo)
            {
              Console.WriteLine(food.Orderid + " " + food.Externalref 
                + "\r\n " + food.Orderremarks);
            }

            Console.Read();

            //Try a new connection (eliminate caching)    
            DB.Dispose();

            DataContext DB2 = new DataContext("User Id=...Password=...;Server=...;");

            Foodorder fo2 = DFunc.GetFoodOrder(10198);
            fo2.Orderremarks = "This should save now.";
            fo2.Orderqty = 9999;
            DB.SubmitChanges();

            //Retrieves a single order:  DFunc.GetFoodOrder(pk)
            Console.WriteLine(DFunc.GetFoodOrder(10198).Orderremarks);
            Console.Read();
        }
    }
}

Консоль считывает правильные обновленные значения, но БД не обновляется.

Функции данных, DFunc.GetFoodOrder (Oid) и функции контекста данных приведены ниже. Оба находятся в другой сборке как LINQ DAL:

    #region Data Context
    private static CommoDTContext cdtDataContext = new CommoDTContext(connectionSTringHere);
    /// <summary>
    /// This property gets the DevArt Oracle DotConnect data context, 
    /// providing LINQ to Oracle, and direct ORM capabilities.
    /// </summary>
    public static CommoDTContext DB
    {
        get
        {
            return cdtDataContext;
        }
        set
        {
            cdtDataContext = value;
        }
    }
    #endregion Data Context


    /// <summary>
    /// Get food order by specifying the order ID.
    /// </summary>
    /// <param name="orderId"></param>
    /// <returns></returns>
    public static Foodorder GetFoodOrder(decimal orderId)
    {   //left out validation/try-catch for brevity.
        if (orderId == 0) return null;
        var food =
            from fo in DB.Foodorders
            where fo.Orderid == orderId
            select fo;
        if (food.FirstOrDefault() == null)
            return null;
        else
            return food.FirstOrDefault();
    }

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

Вот как я модифицировал свою программу, основываясь на ответе Роба.

class Program
{
    static void Main(string[] args)
    {
        string outFmt = "{0} {1} of {2}\r\n {3}";
        CommoDT.Context.CommoDTContext DB =
            new CommoDT.Context.CommoDTContext(PutOracleConnectionStringHere);
        DB.Log = Console.Out;
        Console.WriteLine();

        Foodorder fo2 = DB.Foodorders.Single(x => x.Orderid == 10198);
        fo2.Orderremarks = "These are the first comments.";
        fo2.Orderqty = 1000;
        DB.SubmitChanges();
        Console.WriteLine(outFmt, 
            fo2.Orderid.ToString(), fo2.Orderqty.ToString(), fo2.Externalref, fo2.Orderremarks);
        Console.Read();

        Foodorder fo3 = DFunc.GetFoodOrder(ref DB, 10198);
        fo3.Orderremarks += " And these are the second comments for the order.";
        fo3.Orderqty = 2000;
        DB.SubmitChanges();
        Console.WriteLine(outFmt,
            fo3.Orderid.ToString(), fo3.Orderqty.ToString(), fo3.Externalref, fo3.Orderremarks);
        Console.Read();

        DB.Dispose();
    }
}

        /// <summary>
        /// Get food order by specifying the order ID.
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns>Food</returns>
        public static Foodorder GetFoodOrder(ref CommoDT.Context.CommoDTContext DB, decimal orderId)
        {
            if (orderId == 0) return null;
            var food =
                from fo in DB.Foodorders
                where fo.Orderid == orderId
                select fo;
            if (food.FirstOrDefault() == null)
                return null;
            else
                return food.FirstOrDefault();
        }
0 голосов
/ 11 июля 2010

Вы не показываете, как реализован DFunc.GetFoodOrder (10198).Однако он не имеет доступа к контексту данных.Вы также отправляете изменения в БД после утилизации.Я думаю, что вы хотели отправить против DB2.

Чтобы LINQ мог выполнять обновления, запись должна быть "прикреплена" к контексту данных.Если вы сделаете запрос через DataContext, запись будет прикреплена, и LINQ будет отслеживать изменения.Попробуйте ...

FoodOrder fo2 = DB2.Foodorders.Single(x => x.Orderid == 10198);
fo2.Orderremarks = ...

DB2.SubmitChanges();
...