0

我正在制作一个使用 ADO.NET 的 ASP.NET 应用程序。

用户也可以创建记录并更改它们,但是当我更改记录时,它会按应有的方式更改,但它也会创建一个新的相同记录(使用不同的键)。

当用户想要更改记录时,他从列表中选择它(获取整个实体)并进入新页面,然后文本框会填充来自实体的信息:注意:KorisnickaSesija.izabraniProjekt 是记录(整个实体)我想改变

if (KorisnickaSesija.izabraniProjekt != null)
{
    txtName.Text = KorisnickaSesija.izabraniProjekt.naziv;
    txtOpis.Text = KorisnickaSesija.izabraniProjekt.opis;
    txtPlaca.Text = KorisnickaSesija.izabraniProjekt.cijenaPoSatu.ToString();
    txtGodina.Text = KorisnickaSesija.izabraniProjekt.deadline.Value.Year.ToString();
    txtMjesec.Text = KorisnickaSesija.izabraniProjekt.deadline.Value.Month.ToString();
    txtDan.Text = KorisnickaSesija.izabraniProjekt.deadline.Value.Day.ToString();

    izabraneKategorije = KorisnickaSesija.izabraniProjekt.Kategorija.ToList();
    foreach (var item in izabraneKategorije)
    {
        sveKategorije.Remove(item);
    }
}
lbSveKategorije.DataSource = sveKategorije;
lbSveKategorije.DataTextField = "naziv";
lbSveKategorije.DataBind();
lbIzabraneKategorije.DataSource = izabraneKategorije;
lbIzabraneKategorije.DataTextField = "naziv";
lbIzabraneKategorije.DataBind();

在用户更改了他想要更改的内容后,我这样做:

protected void btnSave_Click(object sender, EventArgs e)
{
    if (txtName.Text.Length > 0 && txtOpis.Text.Length > 0 && txtPlaca.Text.Length > 0 && txtDan.Text.Length > 0 && txtMjesec.Text.Length > 0 && txtGodina.Text.Length > 0 && izabraneKategorije.Count > 0)
    {
            Projekt projekt = new Projekt();
            DateTime deadline = new DateTime(int.Parse(txtGodina.Text), int.Parse(txtMjesec.Text), int.Parse(txtDan.Text));
            projekt.naziv = txtName.Text;
            projekt.opis = txtOpis.Text;
            projekt.cijenaPoSatu = int.Parse(txtPlaca.Text);
            projekt.deadline = deadline;
            projekt.datumObjavljivanja = DateTime.Now;
            foreach (var item in izabraneKategorije)
            {
                projekt.Kategorija.Add(item);
            }

            projekt.Korisnik = KorisnickaSesija.logiraniKorisnik;

            if (KorisnickaSesija.izabraniProjekt != null)
            {
                projekt.projektID = KorisnickaSesija.izabraniProjekt.projektID;
                ProjektService.izmjeniProjekt(projekt);   //change record
            }
            else
            {
                ProjektService.dodajProjekt(projekt);  //create new record - dosnt go here by accident, i checked
            }

        Response.Redirect("HomeEmployer.aspx");
    }
    else
    {
        //ispisi da je greska
    }
}

ProjektService.izmjeniProjekt(projekt); 这是:

public static void izmjeniProjekt(Projekt k)
{
    Projekt kk = getProjektByID(k.projektID);
    kk.naziv = k.naziv;
    kk.opis = k.opis;
    kk.cijenaPoSatu = k.cijenaPoSatu;
    kk.deadline = k.deadline;
    kk.Kategorija.Clear();
    foreach (var item in k.Kategorija)
    {
        kk.Kategorija.Add(item);
    }
    Context.context.SaveChanges();

}

getProjektByID(k.projektID); 这是:

public static Projekt getProjektByID(int id)
{
    var query = (from k in Context.context.Projekt
                 where id == k.projektID

                 select k).FirstOrDefault();
    return query;
}

编辑

经过一番研究后,我认为问题可能在于“Projekt”通过中间表与实体“Kategorija”具有多对多关系。该表在模型中不可见,取而代之的是“Projekt”有 Projekt.Kategorija,而 Kategorija 有 Kategorija.Projekt。另外,我首先制作了我的数据库,然后在什么时候用它生成了我的模型。

4

2 回答 2

1

我认为这是实体框架问题,您可以在“izmjeniProjekt”中使用“Context.context.Projekt.Find(id)”而不是函数“getProjektByID”,可能通过函数传递和获取类型是问题所在你的命名方式太棒了!

问题很明显,实体框架将您的“Projekt”识别为新条目,所以问题是您的数据库表的键,您可能使用代码优先迁移来创建数据库并且您没有指定键,但是通过方式,您有 id,在我看来,没有必要从数据上下文中获取“Projekt”,只需使用它!

也许我想说的不是很清楚,所以观看这个视频(你会在那里看到你的问题)以更好地理解实体框架。

朱莉勒曼发言

于 2013-08-12T17:06:48.953 回答
0

由于我无法编辑 mlh0 的答案,我将单独发布一个。

当使用 ado.NET 将对象添加到数据库中时,并且该对象与其他对象有关系,那么在保存时不要使用导航属性是很重要的。而是使用辅助键。

如果要添加“城市”,请执行

City object = new City();
object.name = "Some name";
object.countryID = someCountry.countryID;  //this will work as intended
//object.country = someCountry;  //this will work NOT as intended
yourContext.City.addObject(object);
yourContext.saveChanges();
于 2013-11-08T18:59:09.693 回答