我有一个问题,我在ADO.NET数据服务中苦苦挣扎:
在为存储组装实体时,我需要从查找文件中获取相关值。例如,一个人的状态代码分配为“待定”,该状态代码位于名为StatusCodes的表中。
在Entity Framework中,我需要将person.StatusCode的值设置为等于StatusCode的实例。在Entity Framework或LINQ2Sql中我会这样:
var person = Person.CreatePerson(stuff);
var statCode = myContext.StatusCodeSet.Where(sc => sc.Description == "Pending").FirstOrDefault();
person.StatusCode = statCode;
// ...more code here...
myContext.BeginSaveChanges(SaveChangesOptions.Batch,
new AsyncCallback(OnSaveAllComplete),
null);
statCode的查询在ADO.NET Data Services中不起作用,我收到运行时错误,说明该函数不受支持。我认为这是因为statCode查找不是异步调用。
然而,
var person = Person.CreatePerson(stuff);
var query = from stat in myContext.StatusCodeSet
where stat.Description == "Pending"
select stat;
var dsQuery = (DataServiceQuery<StatusCode>)query;
dsQuery.BeginExecute(
result => tutorApplication.StatusCode = dsQuery.EndExecute(result).FirstOrDefault(), null);
// ...more code here...
myContext.BeginSaveChanges(SaveChangesOptions.Batch,
new AsyncCallback(OnSaveAllComplete),
null);
由于查询的异步性质,不起作用,结果将在人员保存发生之前返回。
我接近这个吗?
由于
答案 0 :(得分:0)
睡觉后,我想出了以下内容:
var person = Person.CreatePerson(stuff);
var appStatPending = new StatusCode()
{
StatusCodeId = (int)StatusCodes.Pending,
Code = "Pending",
Description = "Pending",
EffectiveDate = DateTime.Now,
EnteredBy = "",
EnteredDate = DateTime.Now
};
myContext.AttachTo("StatusCodeSet", appStatPending);
person.StatusCode = appStatPending;
myContext.SetLink(tutorApplication, "StatusCode", appStatPending);
// ...more code here...
myContext.BeginSaveChanges(SaveChangesOptions.Batch,
new AsyncCallback(OnSaveAllComplete),
null);
我可以创建状态代码的本地副本并将其链接到上下文中。重新启动appStatPending而不是执行StatusCode.CreateStatusCode()非常重要,因为这样做会在人员图持续存在时向数据库添加新的StatusCode。出于同样的原因,执行AttachTo(“StatusCodeSet”,appStatPending)很重要,因为执行myContext.AddToStatusCodeSet()也会在数据库中的StatusCodes表中添加一个新条目。