この特定の方法で問題が発生しています。初めて保存するときは、AppointmentEvent で単一のレコードを作成し、Appointment で検証済みの変数を変更することで機能しますが、ユーザー レコードが再度作成されます。
private void CreateAppointment(Employee user)
{
try
{
using (var db = new CosmeticContext())
{
Appointment appointment = db.Appointment.FirstOrDefault(o => o.name == phoneNumber.name && o.surname == phoneNumber.surname && o.verified == false);
appointment.verified = true;
PhoneNumber ph = db.PhoneNumber.FirstOrDefault(o => o.name == phoneNumber.name && o.surname == phoneNumber.surname);
db.PhoneNumber.Remove(ph);
db.AppointmentEvent.Add(new AppointmentEvent
{
date = DateTime.Now,
Employees = user,
Appointments = appointment,
EventComment = EventComment.Save
});
db.SaveChanges();
}
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
DbScript.ShowEntityErrors(e);
}
}
2回目に実行すると、ユーザー、アポイントイベント、およびアポイントメントレコードが以前の値で複製されます。デバッガーを調べたところ、db.AppointmentEvent.Local のレコードが 0 であることがわかりましたが、2 回目の Add メソッドの後、db.AppointmentEvent.Local に 2 つのレコードが作成されます。1 つの Add メソッドで 2 つのレコードを追加する方法がわかりません。Google は適切なケースを示すのに役立ちませんでしたが、using ブロックはすべてを正しく処理するべきではありませんか?
ここで使用されるオブジェクトを含むいくつかの追加クラスを次に示します。
public class Employee
{
[Key]
public int employeeId { get; set; }
[Required, MaxLength(25), MinLength(4)]
public string userName { get; set; }
[Required, MaxLength(25), MinLength(4)]
public string firstName { get; set; }
[Required, MaxLength(25), MinLength(4)]
public string lastName { get; set; }
[Required, MaxLength(100), MinLength(20)]
public string password { get; set; }
[Required]
public EmployeeType EmployeeType { get; set; }
public virtual List<PhoneNumber> PhoneNumbers { get; set; }
public virtual List<AppointmentEvent> AppointmentEvents { get; set; }
}
public class AppointmentEvent
{
public int appointmentEventId { get; set; }
[Required]
public DateTime date { get; set; }
[Required]
public virtual Employee Employees { get; set; }
[Required]
public virtual Appointment Appointments { get; set; }
[Required]
public EventComment EventComment { get; set; }
}
public class Appointment
{
[Key]
public int appointmentId { get; set; }
[Required, MaxLength(20)]
public string name { get; set; }
[Required, MaxLength(30)]
public string surname { get; set; }
[Required, MaxLength(20), Phone]
public string phone { get; set; }
[Required]
public DateTime date { get; set; }
[Required]
public ServiceType ServiceType { get; set; }
[Required]
public bool verified { get; set; }
public virtual List<AppointmentEvent> AppointmentEvents { get; set; }
}
編集: Windowsフォームアプリケーションと、ユーザー部分を示すコードを作成していることを忘れていました.: これはフォームnr2.:(レコードに問題があります)
public partial class CallCenter : Form
{
Employee employee;
static ListTime listTime = new ListTime();
Button pushedButton = new Button();
public CallCenter(Employee loginEmployee)
{
employee = loginEmployee;
InitializeComponent();
tableLayoutPanel2.CellPaint += tableLayoutPanel1_CellPaint;
GeneratedServiceTypeComboBox.DataSource = Enum.GetValues(typeof(ServiceType));
textBox1.Text = DateTime.Now.AddDays(1).Date.ToString("dd.MM.yyyy");
textBox2.Text = DateTime.Now.AddDays(2).Date.ToString("dd.MM.yyyy");
RefreshAppointmentAvailabilityTable();
}
private void SaveButton_Click(object sender, EventArgs e)
{
try
{
GenerateButton.Enabled = true;
SaveButton.Enabled = false;
this.NameBox.Text = string.Empty;
SurnameBox.Text = string.Empty;
PhoneBox.Text = string.Empty;
GeneratedNameBox.Text = string.Empty;
GeneratedSurnameBox.Text = string.Empty;
GeneratedPhoneBox.Text = string.Empty;
pushedButton.BackColor = Color.LightGreen;
ChangeAppointmentAvailabilityButtonsStatus(false);
CreateAppointment(employee);
}
catch (Exception f)
{ MessageBox.Show(f.ToString()); }
}
...
}
これはform1からです:(ログイン画面)
private void LoginButton_Click(object sender, EventArgs e)
{
using (var db = new CosmeticContext())
{
bool verify = false;
Employee employee = db.Employee.FirstOrDefault(o => o.userName == UserNameBox.Text);
if (employee == null)
MessageBox.Show("Sads lietotajs nav atrasts datubaze", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
{
verify = PasswordAlgorithm.DoesPasswordMatch(employee.password, PasswordBox.Text);
if (verify)
if (employee.EmployeeType == EmployeeType.Seller)
{
CallCenter form1 = new CallCenter(employee);
form1.Show();
this.Hide();
}
}
}
}