问题描述
|
我在程序中添加了一个函数,该函数允许员工将事件来宾转换为客户,因此他们不必重新输入所有内容。
我遇到的一个问题是...访客在其余表的同一表中有一个电话#和rmail。客户将其电话号码和电子邮件存储在单独的一对多表中。
因此,在转换期间,我需要一个“ 0”来分配给电子邮件和电话号码以将其存储到表中。
我如何创建客户并保留“ 0”以用于分配给“ 2”和“ 3”表?
我有一个viewmodel来处理所有变量。
为了对
CustomerPhones
&&CustomerEmails
成功调用SaveChanges()
,我必须对下面的代码执行什么操作才能使其分配CustomerID
?
var customerNew = new Customer
{
CustomerTypeId = customer.CustomerTypeId,FirstName = customer.FirstName,LastName = customer.LastName,FullName = customer.FirstName + \" \" + customer.LastName,Birthday = customer.Birthday,GenderId = customer.GenderId,CompanyName = customer.CompanyName,UserName = customer.UserName,FavMusicId = customer.FavMusicId,OwnerId = customer.OwnerId
};
var phoneNew = new CustomerPhone
{
CustomerId = customer.CustomerId,Number = customer.Number,PhoneTypeId = 5
};
var emailNew = new CustomerEmail
{
CustomerId = customer.CustomerId,Email = customer.Email
};
db.Customers.Addobject(customerNew);
db.CustomerPhones.Addobject(phoneNew);
db.CustomerEmails.Addobject(emailNew);
db.SaveChanges();
return RedirectToAction(\"Details\",new { id = customer.CustomerId });
谢谢,
提姆
额外积分:如果您可以告诉我如何在创建客户之后自动从数据库中删除来宾,而无需单击其他任何东西。 :)
解决方法
如果您已经在数据库级别上建立了适当的外键关系,并且您的EF模型已经选择了它们,那么您应该能够编写:
var customerNew = new Customer
{
// ... set all the properties here
}
var phoneNew = new CustomerPhone
{
Number = customer.Number,PhoneTypeId = 5
};
customerNew.CustomerPhones.Add(phoneNew); // add new phone to the association
var emailNew = new CustomerEmail
{
Email = customer.Email
};
customerNew.CustomerEMails.Add(phoneNew); // add new e-mail to the association
db.Customers.AddObject(customerNew);
db.SaveChanges();
并让EF处理其余所有工作,例如弄清ID和所有内容。
, 将来宾信息(完整)记录到一个存储过程中,该过程将创建新记录(客户,电话和电子邮件)。
额外奖励积分选项
向存储过程添加删除-好处是您可以将其放入事务中
添加一个触发器,该触发器基于在客户表中的插入来删除来宾-如果每个人在成为客户之前都是来宾,这将非常有效
这里的重点是您不必单独在MVC中解决此问题,因为持久性是真正的问题,而不是用户体验。