Итак, вот короткий пробег: Моя система имеет двух типов пользователей: компанию и ученика. Компания отправляет задание, студент применяет (новая запись добавляется в таблицу базы данных приложения), компания выбирает приложение и предлагает работу ученику, сайт переводит его на страницу контракта, где компания может видеть как выглядит контракт и где будет проходить CPR (SSN) учащегося. Он или она заполняет CVR компании (компания SSN) и их имя и фамилия, а также клики. Это создает новую запись в таблице базы данных контракта. Все идет нормально.Попытка обновить запись базы данных, но добавлена новая.
Вот класс Contract.cs модель:
namespace Leepio.Models
{
public class Contract {
public int ContractId { get; set; }
public string StudentId { get; set; }
public string CompanyId { get; set; }
public string CVR { get; set; }
public int ApplicationId { get; set; }
public bool IsSigned { get; set; }
public string StudentSigningDate { get; set; }
public string CompanySigningDate { get; set; }
public string RepFirstName { get; set; }
public string RepLastName { get; set; }
public virtual ApplicationUser Student { get; set; }
public virtual ApplicationUser Company { get; set; }
public virtual Application Application { get; set; }
}
Все наполнено в этой точке, за исключением двух полей: поле IsSigned (следует обратиться к истинным, когда студент принимает и отправляет) и StudentSigningDate, что просто дата в виде строки дня, которую принимает студент). Теперь студент получает электронное письмо, и он или она переходит к ссылке, где они могут видеть предварительный просмотр контракта и текстовое поле, в которое вводится CPR, а затем кнопка отправки.
Теперь вот где проблема начинается.
это метод для кнопки отправки:
public ActionResult SendMailAsAStudent(string studentId, string companyId, int applicationId, string companyCVR, string studentCPR)
{
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var student = manager.FindById(studentId);
var company = manager.FindById(companyId);
var application = db.Applications.Find(applicationId);
var contractobj = db.Contracts.Find(applicationId);
Project projectobj = db.Projects.Find(application.ProjectId);
var myMessage = new SendGridMessage();
myMessage.From = new MailAddress("[email protected]");
myMessage.AddTo(student.Email);
myMessage.AddTo(company.Email);
myMessage.Subject ="The contract for " + projectobj.Title + " is signed!";
myMessage.Html = "Here is the final contract";
LocalReport localReport = new LocalReport();
localReport.ReportPath = Server.MapPath("~/Contracts/Contract.rdlc");
ReportParameter cvrParameter = new ReportParameter("cvrParameter", companyCVR);
ReportParameter companyNameParameter = new ReportParameter("companyNameParameter", company.CompanyName);
ReportParameter companyAddressParameter = new ReportParameter("companyAddressParameter", company.Address);
ReportParameter companyCityParameter = new ReportParameter("companyCityParameter", company.City);
ReportParameter studentCityParameter = new ReportParameter("studentCityParameter", student.City);
ReportParameter studentNameParameter = new ReportParameter("studentNameParameter", student.FirstName+" "+student.LastName);
ReportParameter studentAddressParameter = new ReportParameter("studentAddressParameter", student.Address);
ReportParameter studentZipCodeParameter = new ReportParameter("studentZipCodeParameter", student.ZipCode);
ReportParameter jobStartDateParameter = new ReportParameter("jobStartDateParameter", projectobj.StartDate);
ReportParameter jobEndDateParameter = new ReportParameter("jobEndDateParameter", projectobj.EndDate);
ReportParameter jobDescriptionParameter = new ReportParameter("jobDescriptionParameter", projectobj.Description);
ReportParameter jobHoursPerWeekParameter = new ReportParameter("jobHoursPerWeekParameter", projectobj.HoursPerWeek.ToString());
ReportParameter jobHourlyRateParameter = new ReportParameter("jobHourlyRateParameter", projectobj.HourlyRate.ToString());
ReportParameter cprParameter = new ReportParameter("cprParameter", studentCPR);
ReportParameter studentSignDateParameter = new ReportParameter("studentSignDateParameter", DateTime.Today.ToString("dd/MM/yyyy"));
ReportParameter companySignDateParameter = new ReportParameter("companySignDateParameter", contractobj.CompanySigningDate);
ReportParameter companyRepNameParameter = new ReportParameter("companyRepNameParameter", contractobj.RepFirstName +" "+contractobj.RepLastName);
ReportParameter projectWorkFromParameter = new ReportParameter("projectWorkFromParameter", projectobj.WorkFrom);
localReport.SetParameters(new ReportParameter[] { cprParameter });
localReport.SetParameters(new ReportParameter[] { cvrParameter });
localReport.SetParameters(new ReportParameter[] { companyNameParameter });
localReport.SetParameters(new ReportParameter[] { companyAddressParameter });
localReport.SetParameters(new ReportParameter[] { studentNameParameter });
localReport.SetParameters(new ReportParameter[] { studentAddressParameter });
localReport.SetParameters(new ReportParameter[] { studentZipCodeParameter });
localReport.SetParameters(new ReportParameter[] { jobStartDateParameter });
localReport.SetParameters(new ReportParameter[] { jobEndDateParameter });
localReport.SetParameters(new ReportParameter[] { jobDescriptionParameter });
localReport.SetParameters(new ReportParameter[] { jobHoursPerWeekParameter });
localReport.SetParameters(new ReportParameter[] { jobHourlyRateParameter });
localReport.SetParameters(new ReportParameter[] { studentSignDateParameter });
localReport.SetParameters(new ReportParameter[] { companySignDateParameter });
localReport.SetParameters(new ReportParameter[] { companyRepNameParameter });
localReport.SetParameters(new ReportParameter[] { projectWorkFromParameter });
localReport.SetParameters(new ReportParameter[] { companyCityParameter });
localReport.SetParameters(new ReportParameter[] { studentCityParameter });
string reportType = "PDF";
string mimeType;
string encoding;
string fileNameExtension = "pdf";
Warning[] warnings;
string[] streams;
var renderedBytes = localReport.Render(reportType, "", out mimeType, out encoding, out fileNameExtension, out streams, out warnings);
Response.AddHeader("content-disposition", "attatchment; filename=Contract." + fileNameExtension);
MemoryStream stream = new MemoryStream(renderedBytes);
myMessage.AddAttachment(stream, "Contract.pdf");
var apiKey = "removed for this post";
var transportWeb = new Web(apiKey);
transportWeb.DeliverAsync(myMessage);
Contract contract = db.Contracts.Find(contractobj.ContractId);
contract.IsSigned = true;
contract.StudentSigningDate = DateTime.Today.ToString("dd/MM/yyyy");
//db.Contracts.Add(contract);
db.SaveChanges();
return RedirectToAction("Index", "Projects");
}
Тогда это происходит:
Запись добавляется как я хотел, чтобы она: isSigned ложна и студент подписания дата еще не заполнена. Когда он заполняется, он создает еще одну запись в базе данных, с датой подписания, именем и фамилией компании - false!
В чем причина этого? Я прокомментировал db.Contracs.Add (контракт), я нашел контракт, который мне нужен, с помощью applicationId, поскольку это будет уникальный идентификатор. Что я делаю не так? Я хочу, чтобы можно было добавить дату регистрации ученика и изменить значение IsSigned bool на true. Обратите внимание, что студент CPR не хранится в базе данных, «20» является идентификатор приложения