如何使用编辑表单中的SelectList更新实体引用?

时间:2009-12-31 02:57:27

标签: asp.net asp.net-mvc entity-framework

这是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,运行时会抱怨该实体为空(这也是可以理解的,因为我没有向实体分配任何东西;只有实体参考

可能显而易见的是,我围绕着看起来很简单的情况。但是,我找不到任何覆盖它的教程(这本身就很奇怪)。

此外,我有一个更复杂的问题......客户可能有多个地址,地址有状态...希望,一旦我找出标题 - 我可以推断。

顺便说一句,例子(客户 - 标题 - 地址)是虚构的;但它很好地模拟了这个问题。

1 个答案:

答案 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()