我正在尝试更新EF6中的实体.我已经读过,如果我想更改一个ForeignKey属性,我必须确保导航属性是正确的,或者将其设置为null.
我已将set设置为null方法,但我仍然收到参照完整性约束异常:
A referential integrity constraint violation occurred: The property value(s) of 'Contact.idContact' on one end of a relationship do not match the property value(s) of 'Entity.id_EntityContactInfo' on the other end.
Run Code Online (Sandbox Code Playgroud)
但你可以在调试器中看到,Entity.Contact为null,所以我相信这不应该抛出.

有任何想法吗?
编辑
这是实体的更新方式:
public T CommitUpdate<T>(T obj) where T : class
{
_DbContext.Set<T>().Attach(obj);
_DbContext.Entry(obj).State = EntityState.Modified;
_DbContext.Commit();
return obj;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Winforms开发一个应用程序,并且使用了一个数据绑定我的网格的路径BindingSource.我的问题是:
这是最好的方法吗?我应该手动填充单元格而不是让它BindingSource为我做吗?它会导致进一步的问题吗?如果在任何情况下数据绑定会产生问题,那将是有用的.
我的一位同事发誓黑色和蓝色不使用数据绑定.我真的不相信他说的话,所以任何利弊都是有价值的.
在连接到单个数据库和可编辑DataGrid的多用户应用程序的情况下,如何解决更新数据的并发问题?
性能可以忽略不计吗?
例如,
myQuery.FieldbyName("MyField").AsString;
myQuery.Fields[0].AsString;
Run Code Online (Sandbox Code Playgroud)
案例:具有相当数量字段的表,例如> 50个字段
访问大型结果集,例如> 100,000行
字段名称的可读性好处是否值得降低性能?
在Delphi中,我希望在TRect中绘制文本.我希望有以下功能:
我可以看到Windows.DrawText()函数几乎涵盖了这个功能,但是在写文本时,多行和垂直居中是互斥的.
我想知道这个功能是否内置于Windows(2000+)?如果没有,有没有办法在不编写自己的功能的情况下这样做?
我在一个表中有以下数据:
Time, Type, Kilometers
12:00, 1, 0.1
12:30, 2, 0.2
14:00, 1, 0.4
15:00, 2, 1.0
16:00, 1, 1.2
16:30, 2, 1.5
16:45, 1, 2.0
Run Code Online (Sandbox Code Playgroud)
此数据使用DateTime字段按时间顺序排序.我想将这些记录'对'显示为1行,如下所示:
StartTime, Type1Km, Type2Km
12:00, 0.1, 0.2
14:00, 0.4, 1.0
16:00, 1.2, 1.5
16:45, 2.0, NULL
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:如果没有Type1启动,则在结果表的Type1Km字段中显示NULL.同样,如果没有Type2结束,则在记录的Type2Km字段中显示NULL.
我怎么能这样做?
正如标题所述,我如何获得所有用户都可以访问的临时目录.
Path.GetTempPath() 返回当前用户的临时目录.
假设我有两个这样的表:
Events
ID (PK int autoInc), Time (datetime), Caption (varchar)
Position
ID (PK int autoinc), Time (datetime), Easting (float), Northing (float)
Run Code Online (Sandbox Code Playgroud)
例如,如果我使用该Time字段作为我的加入标准,列出所有事件及其位置是否安全?即:
SELECT E.*,P.* FROM Events E JOIN Position P ON E.Time = P.Time
Run Code Online (Sandbox Code Playgroud)
或者,甚至只是简单地比较日期时间值(考虑到参数化值可能包含小数秒部分 - MySQL一直接受的部分),例如
SELECT E.* FROM Events E WHERE E.Time = @Time
Run Code Online (Sandbox Code Playgroud)
我理解MySQL(版本5.6.4之前)只存储datetime字段WITHOUT毫秒.所以我认为这个查询功能正常.但是从版本5.6.4开始,我已经读过MySQL现在可以使用datetime字段存储毫秒.
假设使用诸如函数插入日期时间值NOW(),则截断毫秒(<5.6.4),我假设允许上述查询起作用.但是,对于5.6.4及更高版本,这可能无法正常工作.我,并且只会对第二准确性感兴趣.
如果有人能回答以下问题,将不胜感激:
编辑
我知道我可以投出日期时间,感谢那些回答,但我正在尝试解决问题的根源(存储类型/定义已被更改的事实),我不想在我的使用函数查询.这否定了我优化应用索引等查询的所有工作,更不用说重写我的所有查询了.
EDIT2
任何人都可以建议不DATETIME使用第二准确度加入某个领域的原因吗?
我想知道为什么有单独的方法来填充导航属性.
如果我在整套工作,我可以打电话Include给财产或集合.
但是,如果我处理单个实体,则根据项目是collection(Collection)还是单引用(Reference),有两种不同的方法可以调用.
有没有办法解决这个问题 - 这使得事情变得比我想象的更复杂.谁能解释为什么在设计EF时决定了这一点?
编辑
进一步研究,问题更深入.我试图做的是创建一种在单个实体上加载集合/导航属性的通用方法.使用Include可以在整个集合上轻松完成.但该方法的签名Reference和Collection略有不同.
没关系,将不得不在我的应用程序周围分散这些调用.
例如
dbSet<T>().Include(e => e.Property).Include(e => e.Collection).Include(e => e.Collection.Property)
Run Code Online (Sandbox Code Playgroud)
一切似乎都有效.
但是,对单个实体的调用是不同的:
context.Entry(entity).Reference(e => e.Property).Load();
context.Entry(entity).Reference(e => e.Property.Select(e => e.SubProperty)).Load();
context.Entry(entity).Collection(e => e.Collection).Load();
Run Code Online (Sandbox Code Playgroud) 这是这个问题的延续: 多任务延续
我在答案中更改了我的代码,但是现在我在TaskCancelledExceptions尝试运行任务时收到了.
public virtual async Task RunAsync(TaskWithProgress task)
{
Show();
TaskIsRunning();
await SetCompletedHandler(TaskComplete());
await SetCancelledHandler(TaskCancelled())
await SetFaultedHandler(TaskFaulted());
await task;
Close();
}
Run Code Online (Sandbox Code Playgroud)
但是以下代码没有.我有点卡住原因.
public virtual Task RunAsync(TaskWithProgress task)
{
Show();
TaskIsRunning();
SetCompletedHandler(TaskComplete());
SetCancelledHandler(TaskCancelled())
SetFaultedHandler(TaskFaulted());
return task;
}
Run Code Online (Sandbox Code Playgroud)
调用代码基本上涉及以下内容:
await progressDialog.RunAsync(task);
Run Code Online (Sandbox Code Playgroud)
编辑:
我没有取消cancellationtoken任何地方,所以我不明白为什么这会抛出异常.
三个SetXXXHandler()方法基本上执行以下具有不同延续状态的代码:
task.ContinueWith(_ => action(), CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled, this.Scheduler);
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪在这里:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at FugroDXExt.frmBaseProgressAsync.<RunAsync>d__7.MoveNext() in d:\C#\FugroDXExt\trunk\frmBaseProgressAsync.cs:line 92
--- End of stack trace from previous location where exception was thrown --- …Run Code Online (Sandbox Code Playgroud) 有人可以解释这两个陈述之间的区别:
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ => CompressArchiveAsync());
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Run Code Online (Sandbox Code Playgroud)
VS
Task<Task> bTask = backup.BackupCurrentDatabaseAsync()
.ContinueWith(_ =>
{
CompressArchiveAsync();
});
//unwrap the tasks to produce one entire task
Task t = bTask.Unwrap();
Run Code Online (Sandbox Code Playgroud)
该方法ExtractArchiveAsync(),BackupCurrentDatabaseAsync(),RestoreDatabaseAsync()全部返回Task.
这里,第一个Continuation返回a Task<Task>.然后我可以Unwrap()将此任务放在结果(内部)任务上.
第二个版本不编译.这里唯一不同的是周围的牙箍CompressArchiveAsync().
我试图访问结果(内部)Task来检查Task.Status.如果我使用第二种方法,Task.Status将报告BackupCurrentDatabaseAsync()任务的结果.
c# ×5
.net ×3
async-await ×2
delphi ×2
mysql ×2
asynchronous ×1
data-binding ×1
dataset ×1
datetime ×1
directory ×1
join ×1
performance ×1
sql ×1
text ×1
winforms ×1