C# Linq:为什么这种方法不';好像不行?标准方法应该是什么?

C# Linq:为什么这种方法不';好像不行?标准方法应该是什么?,c#,linq-to-sql,crud,C#,Linq To Sql,Crud,为什么这种方法似乎不起作用?标准方法应该是什么 [Database(Name = "Test")] [Table(Name = "Order")] public class Order { [Column(Name = "ID", IsPrimaryKey = true)] public int ID { get; set; } [Column(Name = "OrderDate")] public DateTime OrderDate { get; set;

为什么这种方法似乎不起作用?标准方法应该是什么

[Database(Name = "Test")]
[Table(Name = "Order")]
public class Order
{
    [Column(Name = "ID", IsPrimaryKey = true)]
    public int ID { get; set; }

    [Column(Name = "OrderDate")]
    public DateTime OrderDate { get; set; }


    public static Order Get(int id)
    {
        Order item = null;

        try
        {
            DataContext dc = new DataContext(@"Data Source=.\sqlexpress;Initial Catalog=Test;Integrated Security=True");

            var items = from order
                        in dc.GetTable<Order>()
                        where order.ID == id
                        select order;

            item = items.FirstOrDefault<Order>();

            dc.Dispose();
        }
        catch (Exception ex)
        {
            item = null;

            throw ex;
        }

        return item;
    }

    public bool Delete()
    {
        bool success = false;

        try
        {
            DataContext dc = new DataContext(@"Data Source=.\sqlexpress;Initial Catalog=Test;Integrated Security=True");

            dc.GetTable<Order>().DeleteOnSubmit(this);

            success = true;
        }
        catch (Exception ex)
        {
            success = false;

            throw ex;
        }

        return success;
    }
}

class Program
{
    static void Main(string[] args)
    {            
        Order order = Order.Get(1);

        order.Delete();

        Console.ReadLine();
    }
}
我还尝试了以下方法:

DataContext dc = new DataContext(@"Data Source=(local)\sqlexpress;Initial Catalog=Relationships_Test;user=;password=;Integrated Security=True");

dc.GetTable<Order>().Attach(this);
dc.GetTable<Order>().DeleteOnSubmit(this);
DataContext dc=newdatacontext(@“数据源=(本地)\sqlexpress;初始目录=关系\测试;用户=;密码=;集成安全=真”);
dc.GetTable().Attach(这个);
dc.GetTable().deleteoSubmit(this);

它也不起作用。

您正在
Delete()
方法中创建一个新的
DataContext
,该方法不“知道”您试图删除的
顺序
对象。(“未附实体”)

首先将
Order
对象附加到
DataContext

编辑
您可能必须在
Get(…)
方法中调用
item.Detach()
,才能在
Delete
方法中成功调用
dc.Orders.Attach(…)

编辑2
哦,顺便说一句:您的
catch
处理程序有些无用——它们基本上什么都不做,因为当异常被重试时,将不使用返回值。捕获调用代码中的异常-无需返回
success
标志或将
项设置为
null

编辑3

当然,正如Chris所说,您必须调用
SubmitChanges
来实际执行某些操作。但是,我假设您已经在这样做了,只是因为您遇到了异常而被询问。

您正在
Delete()
方法中创建一个新的
DataContext
,它不“知道”您试图删除的
顺序
对象。(“未附实体”)

首先将
Order
对象附加到
DataContext

编辑
您可能必须在
Get(…)
方法中调用
item.Detach()
,才能在
Delete
方法中成功调用
dc.Orders.Attach(…)

编辑2
哦,顺便说一句:您的
catch
处理程序有些无用——它们基本上什么都不做,因为当异常被重试时,将不使用返回值。捕获调用代码中的异常-无需返回
success
标志或将
项设置为
null

编辑3

当然,正如Chris所说,您必须调用
SubmitChanges
来实际执行某些操作。但是,我认为您已经在这样做了,只是因为您遇到了异常而被询问。

即使您将它附加到上下文中,您也必须调用实际执行的命令


如果要调用DataContext.Dispose(),应该从try/catch/finally子句的块中执行。您可能不应该手动调用它,而应该使用。

即使将它附加到上下文中,也必须调用命令才能实际执行


如果要调用DataContext.Dispose(),应该从try/catch/finally子句的块中执行。与其手动调用,不如使用。

我认为让业务对象尽可能不知道持久性机制更为标准。看看LINQtoSQL设计器创建实体的方式。对象本身不知道DataContext。它们有钩子,允许数据上下文为更改添加通知机制,还有其他钩子,允许实体为其生命周期内发生的特定事件(创建、验证等)添加代码。它们还被创建为部分类实现,因此您可以根据需要添加更多代码并实现提供的部分方法挂钩


更好、更标准的方法是使用设计器和设计器生成的类作为ORM,通过部分类实现添加更多代码。或者,您可以在生成的数据上下文上分层模式(或),甚至选择不同的ORM(,例如)。

我认为让业务对象尽可能不知道持久性机制更为标准。看看LINQtoSQL设计器创建实体的方式。对象本身不知道DataContext。它们有钩子,允许数据上下文为更改添加通知机制,还有其他钩子,允许实体为其生命周期内发生的特定事件(创建、验证等)添加代码。它们还被创建为部分类实现,因此您可以根据需要添加更多代码并实现提供的部分方法挂钩

更好、更标准的方法是使用设计器和设计器生成的类作为ORM,通过部分类实现添加更多代码。或者,您可以在生成的数据上下文上分层一个模式(或),甚至选择一个不同的ORM(,例如)。

如果您有一个在DataContext上下文中创建的对象(本例中为Order item),一旦您处理了DataContext,该对象将成为孤立对象

要从数据库中删除孤立对象,您需要要么不处理原始DataContext,要么以某种方式将对象附加到新DataContext(这可能很棘手)

处理此问题的最简单方法是在主方法中新建DataContext,然后在主方法末尾处处置DataContext(这是一种标准模式)。

如果您有一个在DataContext上下文中创建的对象(本例中为订单项),一旦处置DataContext,该对象将成为孤立对象

要从数据库中删除孤立对象,您需要要么不处理原始DataContext,要么以某种方式将对象附加到新DataContext(这可能很棘手)

处理此问题的最简单方法是在主方法中新建DataContext,然后在主方法末尾处理DataContext(这是一种标准模式)。

DataContext dc = new DataContext(@"Data Source=(local)\sqlexpress;Initial Catalog=Relationships_Test;user=;password=;Integrated Security=True"); dc.GetTable<Order>().Attach(this); dc.GetTable<Order>().DeleteOnSubmit(this);