我们有一个Oracle表,其中包含三列的复合键.这些列通过实体框架数据模型正确映射到C#对象.当我们从数据库查询记录然后更新非键列时,我们总是会收到一条错误消息,说我们正在尝试更新主键(下面是测试的摘录):
var connection = new DbContextProvider(() => new DatabaseConnection());
var repo = new Repository(connection);
var deltas = repo.Queryable<Deltas>().Where(d =>d.Volume.SubmissionId == 88921).ToList();
var deltaToUpdate = deltas.First();
deltaToUpdate.RecordedVolume = 0;
repo.Flush(); -- Does a context.SaveChanges() in background
Run Code Online (Sandbox Code Playgroud)
我们总是收到以下信息:
System.InvalidOperationException:属性"COPY_ID"是对象的密钥信息的一部分,无法修改.
COPY_ID是密钥的一部分,但是StoredGeneratedPettern = Identity,并且在事务中不会更改.
任何帮助赞赏.
这是完整的堆栈:
System.InvalidOperationException:属性"COPY_ID"是对象的密钥信息的一部分,无法修改.at Data.Objects.EntityEntry.VerifyEntityValueIsEditable(StateManagerTypeMetadata typeMetadata,Int32 ordinal,String memberName)
at System.Data.Objects.EntityEntry.GetAndValidateChangeMemberInfo(String entityMemberName,Object complexObject,String complexObjectMemberName,ref StateManagerTypeMetadata typeMetadata,ref String changingMemberName,ref Object changingObject)
at System.Data.Objects.EntityEntry.EntityMemberChanging(String entityMemberName,Object complexObject,String complexObjectMemberName)
at System.Data.Objects.EntityEntry.EntityMemberChanging(String entityMemberName)
at System.Data.Objects.ObjectStateEntry.System.Data.Objects.DataClasses.IEntityChangeTracker.EntityMemberChanging(String entityMemberName)
在System.Data.Objects.Internal.SnapshotChangeTrackingStrategy.SetCurrentValue(EntityEntry条目,StateManagerMemberMetadata成员,Int32序数,对象目标,对象值)
在System.Data.Objects.Internal.EntityWrapper`1.SetCurrentValue(EntityEntry条目,StateManagerMemberMetadata成员,Int32序数,对象目标,对象值)
在System.Data.Objects.EntityEntry.SetCurrentEntityValue(StateManagerTypeMetadata metadata,Int32 ordinal,Object userObject,Object newValue)
at System.Data.Objects.ObjectStateEntryDbUpdatableDataRecord.SetRecordValue(Int32 ordinal,Object value) …
我一直在寻找在我正在开发的项目中实现这些模式.UoW具有数据库上下文,然后使用该上下文实例化许多存储库.我的问题是处理上下文.我见过很多文章都将存储库作为IDisposable,然后处理上下文.这让我感到困惑,我错过了什么,或者(在我的情况下)是否只是处理上下文的UoW?另外,我应该在我的存储库中实现IDisposable吗?
谢谢
克里斯
我已经编写了一些代码来从网站下载文件.该代码适用于测试http网址.一旦我将URL更改为https,我就会有一个连接超时.
System.setProperty("http.proxyHost","trproxy.rwe.com") ;
System.setProperty("http.proxyPort", "80") ;
Authenticator.setDefault (new MyAuthenticator("USER","PW"));
//URL url = new URL("http","www.treasury.gov",80,"/ofac/downloads/sdn.csv",new sun.net.www.protocol.http.Handler()); THIS WORKS
URL url = new URL("https", "downloads.elexonportal.co.uk",443,"/bmradataarchive/download?key=MYKEY&filename="+filename,new sun.net.www.protocol.https.Handler());
url.openConnection();
InputStream reader = url.openStream();
FileOutputStream writer = new FileOutputStream("C:/downloads/"+filename);
Run Code Online (Sandbox Code Playgroud)
如果我将https网址复制到浏览器中,我会被问到我希望保存文件的位置,并且工作正常.任何帮助非常感谢.我试过这个 但是没用
谢谢克里斯
我们有一个根据MVVM模式构建的应用程序.在不同的时间,我们启动任务以转到数据库以检索数据,然后我们填充一个ObservableCollection,WPF控件与该数据绑定到该ObservableCollection.
我们有点困惑,当我们在任务线程而不是UI线程上填充ObservableCollection时,UI仍然正在更新/正常运行.我们期待一个错误,并且必须更改代码以填充UI线程上的集合.
这是一个危险的场景吗?我们应该填充UI线程吗?
获取数据的代码:
Task.Factory.StartNew(() =>
UiDataProvider.RefreshForwardContractReport(fcrIdField.Value)
)
.ContinueWith(task => {
if (task.Result.OperationSuccess)
{
// This updates the ObseravableCollection, should it be run on UI thread??
RefreshReport(task.Result.OperationResult);
}
});
Run Code Online (Sandbox Code Playgroud)