C# 更改实体也会创建一个新实体
我正在制作一个使用ADO.NET的ASP.NET应用程序 用户可以创建记录并对其进行更改,但当我更改记录时,它会按应有的方式进行更改,但它也会创建一个新的相同记录(使用不同的键) 当用户想要更改记录时,他会从列表中选择该记录(获取整个实体)并进入一个新页面,然后文本框中填充实体的信息: 注意:KorisnickaSesija.izabraniProjekt是我要更改的记录(整个实体)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
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”是没有必要的,只要使用它就行了!”