这是this post中讨论的后续行动。我不知道如何在一个2个月的线程中提出后续问题;所以如果有更好的方法我会道歉。
无论如何,重申我有一个ASP.NET MVC Edit表单,其中一个字段是一个选择列表。我得到的值很好,但我在Post后更新主要实体时遇到了麻烦。显然,我有查找实体的关键,但是加载所有查找似乎很疯狂。因此,建议的解决方案是实体参考
为清楚起见,假设我有一个客户作为主要实体,而标题(先生/夫人/博士等)作为查询。
因此,上面的链接表明以下内容:
customer.TitleReference.EntityKey = new EntityKey("MyEntities.Titles", "Id",
Int32.Parse(formData["personTitle"]);
到目前为止,这么好。我分配实体密钥(我在调试器中看到的确实是我所期望的)。但我无法弄清楚如何将新值与其他客户字段一起保存。我正在做以下事情:
var originalCustomer = (from c in MyEntities.Customers
where c.Id = customer.Id select c).first();
MyEntities.ApplyPropertyChanges(originalCustomer.EntityKey.EntitySetName,
customer);
这会更新所有客户字段,除了查找。直观地说,它(有些)是可以理解的,因为如果我指定originalCustomer.EntityKey.EntitySetName,则ApplyPropertyChanges会忽略originalCustomer.TitleReference.EntityKey.EntitySetName。
但如果我执行指定originalCustomer.TitleReference.EntityKey.EntitySetName,运行时会抱怨该实体为空(这也是可以理解的,因为我没有向实体分配任何东西;只有实体参考
可能显而易见的是,我围绕着看起来很简单的情况。但是,我找不到任何覆盖它的教程(这本身就很奇怪)。
此外,我有一个更复杂的问题......客户可能有多个地址,地址有状态...希望,一旦我找出标题 - 我可以推断。
顺便说一句,例子(客户 - 标题 - 地址)是虚构的;但它很好地模拟了这个问题。
答案 0 :(得分:3)
这应该有效:
var originalCustomer = (from c in MyEntities.Customers
where c.Id = customer.Id select c).First();
originalCustomer.TitleReference.EntityKey = new EntityKey("MyEntities.Titles", "Id",
Int32.Parse(formData["personTitle"]);
context.SaveChanges()