0

我在更新数据库时遇到问题。应用程序显示更新的值,但数据库不显示。没有返回错误。我的桌子有一个PK。使用 DotConnect for 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();
    }
4

2 回答 2

0

以下是我根据 Rob 的回答修改我的程序的方法。

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();
        }
于 2010-07-12T04:35:32.083 回答
0

您没有展示 DFunc.GetFoodOrder(10198) 是如何实现的。但是,它似乎无法访问数据上下文。您还可以在处置后提交对 DB 的更改。我认为您的意思是针对 DB2 提交。

为了让 LINQ 进行更新,记录必须“附加”到数据上下文。如果您通过 DataContext 查询,记录将被附加并且 LINQ 将跟踪更改。尝试...

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

DB2.SubmitChanges();
于 2010-07-11T08:22:36.897 回答