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);