Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改实体也会创建一个新实体_C#_Asp.net_Sql Server_Visual Studio 2010_Ado.net - Fatal编程技术网

C# 更改实体也会创建一个新实体

C# 更改实体也会创建一个新实体,c#,asp.net,sql-server,visual-studio-2010,ado.net,C#,Asp.net,Sql Server,Visual Studio 2010,Ado.net,我正在制作一个使用ADO.NET的ASP.NET应用程序 用户可以创建记录并对其进行更改,但当我更改记录时,它会按应有的方式进行更改,但它也会创建一个新的相同记录(使用不同的键) 当用户想要更改记录时,他会从列表中选择该记录(获取整个实体)并进入一个新页面,然后文本框中填充实体的信息: 注意:KorisnickaSesija.izabraniProjekt是我要更改的记录(整个实体) if (KorisnickaSesija.izabraniProjekt != null) { txtN

我正在制作一个使用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();

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

                 select k).FirstOrDefault();
    return query;
}
getProjektByID(k.projektID);这是:

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();

}
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。
另外,我首先创建了我的数据库,然后从中生成了我的模型。

我认为这是实体框架的问题,您可以在“izmjeniProjekt”中使用“Context.Context.Projekt.Find(id)”而不是您的函数“getProjektByID”,也许通过函数传递和获取类型是个问题,顺便说一下,您的命名太棒了

问题很明显,entity framework将您的“Projekt”识别为一个新条目,因此问题在于数据库表的键,您可能使用了代码优先迁移来创建数据库,但您没有指定键,但顺便说一下,您有id,在我看来,从数据上下文获取“Projekt”是不必要的,就用它吧

也许我想说的不清楚,所以看这段视频(你会看到你的问题),更好地理解实体框架


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

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

如果你想添加一个“城市”,那么就这样做


Context.Context.Projekt dosnt有一个Find(int)函数,我不知道你的意思。我是克罗地亚人,这是bacherlor的作品,所以我使用克罗地亚人的名字^^^我尝试了
Projekt kk=Context.Context.Projekt.Where(p=>p.projektID==k.projektID.).FirstOrDefault()而不是“getProjektByID”,与以前相同。如果可能,请使用实际的代码片段详细说明响应。有助于更好地理解您的响应首先,我认为您可以通过添加或更改重用一些用户代码来说明您的想法。您也可以将摘录的代码片段放在
中(或选择并单击邮箱顶部的{}图标)。我使用选项制作模型,从现有数据库中生成它,这有帮助吗?你所说的“你有这个id,在我看来,从数据上下文中获取“Projekt”是没有必要的,只要使用它就行了!”