无法使用实体框架

时间:2018-01-04 01:24:06

标签: c# entity-framework

我的对象不会保存,无论我做什么,他们都会获取并获取信息并创建新记录但不更新。

这是代码,详细说明了获取现有患者然后修改记录设置状态然后调用保存更改这是在最后三个小时出现问题。我被告知你必须改变一个对象的实体状态才能保存,但是当我试图附加它时它说它已经附加了

Appointment _appointment = new Appointment();
int errorCount = 0;

Patient _patient = SourceDal.getPatientByPatientNewId(Convert.ToInt32(txtPatientId.Text));

_patient.SSN = txtSSN.Text;
_patient.FirstName = txtPatientFirstName.Text;
_patient.LastName = txtPatientLastName.Text;
_patient.Middle = txtPatientMiddle.Text;
_patient.AddressOne = txtPatientAddressOne.Text;
_patient.City = txtPatientCity.Text;
_patient.State = txtPatientState.Text;
_patient.ZipCode = txtPatientZip.Text;

_patient.HomePhone = txtPatientHomePhone.Text;
_patient.WorkPhone = txtPatientWorkPhone.Text;
_patient.CellPhone = txtPatientCellPhone.Text;

if (rBtnHomePhone.Checked == true)
    //   _patient.ApptPhone = txtPatientHomePhone.Text;

if (rBtnHomePhone.Checked == true)
    //   _patient.ApptPhone = txtPatientHomePhone.Text;

if (rBtnWorkPhone.Checked == true)
    // _patient.ApptPhone = txtPatientWorkPhone.Text;

_patient.BirthDate = dtBirthDate.DateTime;
_patient.emailAddress = txtPatientEmail.Text;
_patient.Race =   Convert.ToInt32(dpRace.SelectedValue);
_patient.Ethnicity =Convert.ToInt32(dpEthnicity.SelectedValue);
_patient.Language =  Convert.ToInt32(dpLanguages.SelectedValue);

if (dpGender.Text == "")
{
    dpGender.Focus();
    errorCount = 1;
    lblGenderRequired.Text = "* Gender is required.";
}
else
{
    errorCount = 0;
    lblGenderRequired.Visible = false;
}

_patient.Gender = "M";
_patient.PatientID = txtPatientId.Text;

SourceDal.SourceEntities.Patients.Attach(_patient);
SourceDal.SourceEntities.Patients.Context.ObjectStateManager.ChangeObjectState(_patient, EntityState.Modified);
SourceDal.SourceEntities.SaveChanges();

我得到的错误是

  

未处理的类型' System.InvalidOperationException'发生在System.Data.Entity.dll

中      

附加信息:IEntityChangeTracker的多个实例无法引用实体对象。

编辑2

显示我的函数getPaitnetByPatineyNewId

的代码
    public Patient getPatientByPatientNewId(int newId)
    {
        Patient patient = new Patient();

        if (newId == -1)
        {
            patient = new Patient();
        }
        else
        {
            patient = SourceEntities.Patients
                                    .Where(w => w.ID == newId)
                                    .FirstOrDefault();
        }

        return patient;
    }

2 个答案:

答案 0 :(得分:2)

我认为您在DAL中正确分离关注点存在一些问题,但对于简短的解决方案,您应该只添加(而不是附加),如果它是新实体

if (_patent.PatentId == 0)
{
    _patient.PatientID = txtPatientId.Text; // If you're using an identity column, remove this line. I would also strongly suggest not letting the user change this...
    SourceDal.SourceEntities.Patients.Add(_patient);
}

答案 1 :(得分:0)

对于其他人而言,上述情况对我不起作用,所以这就是我必须要做的。我在我的表单isUpdate上放了一个标志,然后检查保存按钮然后如果保存调用类似于下面那么如果添加只是调用savechanges并且它现在正在工作谢谢大家帮助希望这有帮助的人。

public void SaveProviders(Provider _providers)
{
  try
    {


            using (var ctx = new SMBASchedulerEntities(this.Connectionstring))
            {
                ctx.Providers.Add(_providers);
                ctx.Entry(_providers).State = System.Data.Entity.EntityState.Modified;
                ctx.SaveChanges();
            }
        }


        catch (DbEntityValidationException e)
        {
            foreach (var eve in e.EntityValidationErrors)
            {
                Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().Name, eve.Entry.State);
                foreach (var ve in eve.ValidationErrors)
                {
                    Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                        ve.PropertyName, ve.ErrorMessage);
                }
            }
            throw;
        }

    }