有什么理由这样的东西不起作用吗?
这是我多次用LINQ更新表中记录的逻辑:
DataClasses1DataContext db = new DataClasses1DataContext();
User updateUser = db.Users.Single(e => e.user == user);
updateUser.InUse = !updateUser.InUse;
db.Log = new System.IO.StreamWriter(@"c:\temp\linq.log") { AutoFlush = true };
db.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
(updateUser.InUse是一个位字段)
由于某种原因,它无法正常工作.当我检查linq.log时,它是完全空白的.
我的.dbml可能有问题吗?其他表似乎工作正常,但我比较.dbml中的属性,它们都匹配.
好像是db.SubmitChanges()
; 没有检测到任何需要的更新.
首先,这不是一个多用户问题,因为我在本地数据库的开发版本上工作.
Row not found or changed
当我执行db.SubmitChanges()时,我得到了不太明确的错误.如果我在SubmitChanges()发生之前中断执行,我可以检入SQL Server Management Studio并且该行确实存在!
这是整个函数的代码,只是为了让任何想要帮助的人在上下文中,但问题行最后是正确的(第48行).
更新这是一个非常奇怪的错误:错误是由更新matchingTrans.Url引起的(请参阅倒数第二行代码).注释掉这一行并不会引发错误 - 即使匹配的Trans.Title仍然得到更新.
private static void MenuItemUpdate(int languageId, NavigationItem item)
{
using (var db = DataContextFactory.Create<MyDataContext>())
{
// Select existing menu item from database.
var dbItem =
(from i in db.MenuItems
where i.Id == item.Id
select i).Single();
// Obtain ID of link type.
dbItem.FkLinkTypeId = GetLinkTypeByName(
Enum.GetName(typeof (NavigationItemLinkType), item.LinkType)).Id;
// Update the Link field with what is given.
dbItem.Link = item.Link;
db.SubmitChanges();
// Item already exists …
Run Code Online (Sandbox Code Playgroud) 我一直在互联网上搜索,但我似乎无法找到它.DataContext可以抛出什么异常?或者更具体地说,DataContext.SubmitChanges()方法抛出了什么异常?
编辑
作为参考,这里列出了可能由L2S DataContext引发的已知异常:
我正在使用Linq to SQL.我有一个DataContext,我就是.SubmitChanges()'.插入标识字段时出错,我希望看到它用于插入此标识字段的查询.
我在快速监视器中看不到查询本身; 我在哪里可以从调试器中找到它?
事先道歉,因为这不是一个问题,而是一个解决方案 - 但是需要大量的搜索才能找到答案并且谷歌没有多大帮助,所以我想通过提供错误来回馈社区.帮助未来googlers的解决方案.
使用LINQ to SQL时,我在向数据表提交更改(第二次)时遇到了问题.我第一次提交更改都没关系,第二次提交更改我收到了一个SQL异常,其中说:
"The text, ntext, and image data types cannot be compared or sorted,
except when using IS NULL or LIKE operator"
Run Code Online (Sandbox Code Playgroud)
当我调用SubmitChanges()时抛出了异常,但由于LINQ的延迟加载,当我调用Refresh(RefreshMode.KeepCurrentValues,myObject)时它实际上出现在上一行中.
使用LINQ-to-SQL,我想在插入父实体时自动创建子记录.基本上,模仿SQL Insert触发器的工作方式,但是在代码中,以便可以进行一些额外的处理.
父亲与孩子有关联,但似乎我不能简单地在DataContext期间添加新的子记录SubmitChanges()
.
例如,
public partial class Parent
{
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if(action == System.Data.Linq.ChangeAction.Insert)
{
Child c = new Child();
... set properties ...
this.Childs.Add(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将是理想的,但遗憾的是新创建的Child
记录未插入数据库.有道理,因为DataContext有一个对象/语句列表,可能不喜欢在它的中间添加新项目.
类似地,拦截partial void InsertParent(Parent instance)
DataContext中的函数并尝试添加Child
记录会产生相同的结果 - 没有错误,但没有添加到数据库中.
有没有办法在不向表示层添加代码的情况下获得此类行为?
更新:
无论是OnValidate()
和InsertParent()
功能从DataContext的就是所谓的SubmitChanges()
功能.我怀疑这是我正在尝试做的事情的固有困难 - 在将InsertOnSubmit()
现有更改提交到数据库的过程中,DataContext将不允许插入其他对象(例如,通过).
理想情况下,我希望将所有内容保留在一个Transaction下,以便在插入/更新期间发生任何错误时,数据库中实际上没有任何更改.因此,我尝试模仿SQL触发器功能,允许通过对DataContext SubmitChanges()
函数的单次调用自动插入子记录.
我有这个代码:
<form Name="AddPlace" ID="AddPlace" action="AddPlace.aspx" class="niceform" method="post" runat="server">
Run Code Online (Sandbox Code Playgroud)
当我尝试执行代码时,我得到了这个:
<form name="aspnetForm" method="post" action="AddPlace.aspx" id="aspnetForm" class="niceform">
Run Code Online (Sandbox Code Playgroud)
怎么变了?
我有以下entites /表:
Board
:一块板可以有很多引脚Pin
:一个引脚分配给一个板.该实体是抽象的,并且具有具有不同实现的子项.所有属于父pin实体的子节点InheritanceMapping
将被保存到pin表中并用a区分Discriminator column
TaskPin
:这是pin的一个子实现.它可以有很多任务.Task
:一个任务分配给一个TaskPin以下是一些使我的结构更清晰的代码:
[Table]
public class Board : ModelBase
{
private int _boardId;
[Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity"
,CanBeNull = false, AutoSync = AutoSync.OnInsert)]
public int BoardId
{
get { return _boardId; }
set { SetProperty(ref _boardId, value); }
}
private EntitySet<Pin> _pins;
[Association(Storage = "_pins", OtherKey = "_boardId"
,ThisKey = "BoardId", DeleteRule = "CASCADE")]
public EntitySet<Pin> Pins
{
get { …
Run Code Online (Sandbox Code Playgroud) 我在数据库中有一个表,主键说emp_pk
.现在使用LINQ我正在尝试对它执行一些操作.当我改变几个属性并打电话时,
context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
理想情况下,where子句应该包含where emp_pk = value
.
但是当我从SQL分析器查看查询时,我在where子句中看到很多条件,我相信它是由LINQ引擎生成的.这导致了一个重大的性能问题.
在这种情况下,有谁可以帮助我优化查询?
我在WPF中用LINQ-TO-SQL建立了一个非常简单的例子.
我可以像这样得到一个对象(pageItem),我可以更改属性,当我调用SubmitChanges()时,它没有给我任何错误,但它没有保存更改.
MainDataContext db = new MainDataContext();
var pageItem = (from p in db.PageItems
where p.Id == 1
select p).SingleOrDefault();
pageItem.Title = "changed";
db.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
什么可能导致SubmitChanges不提交更改?
这也不起作用,即使db.ExecuteCommand不起作用,奇怪的是当调试F11没有进入SubmitChanges()或ExecuteCommand()时,为什么我不能介入呢?
using (var db = new MainDataContext())
{
var pageItem = (from p in db.PageItems
where p.Id == 1
select p).SingleOrDefault();
pageItem.Title = "changed";
db.SubmitChanges();
db.ExecuteCommand("INSERT INTO PageItems (Title) VALUES ('this is the title')");
if (pageItem != null)
MainContent.Children.Add(new QuickForm(pageItem));
}
Run Code Online (Sandbox Code Playgroud)
submitchanges ×10
linq-to-sql ×9
c# ×5
linq ×5
datacontext ×3
asp.net ×1
exception ×1
forms ×1
ntext ×1
triggers ×1
where-clause ×1
wpf ×1