[英]Entity Framework, Problem with saving new database entry
我試圖保存我的新數據庫條目,但 ID 需要增加。
這是表列:
我正在使用實體框架和 Windows Forms。添加我的 postgresql 數據庫后,它創建了處理器 class。
public partial class Procesor
{
public int ID { get; set; }
public string Naziv_Procesora { get; set; }
public Nullable<int> Godina_Proizvodnje { get; set; }
public string Naziv_Proizvodaca { get; set; }
public Nullable<int> Broj_Jezgri { get; set; }
public Nullable<double> Takt_Procesora { get; set; }
public Nullable<decimal> Cijena_Procesora { get; set; }
public virtual Konfiguracija_Racunala Konfiguracija_Racunala { get; set; }
}
}
之后我創建了新的 class 用於生成綁定列表並插入數據庫
class Procesori
{
public BindingList<Procesor> DohvatiProcesore()
{
BindingList<Procesor> listaProcesora;
using (RacunalaEntities enteties = new RacunalaEntities())
{
listaProcesora = new BindingList<Procesor>(enteties.Procesors.ToList());
}
return listaProcesora;
}
public void unosProcesora(string naziv, int godina, string proizvodac, decimal cijena, int jezgre, double takt)
{
using (RacunalaEntities enteties = new RacunalaEntities())
{
Procesor procesor = new Procesor();
procesor.Naziv_Procesora = naziv;
procesor.Naziv_Proizvodaca = proizvodac;
procesor.Godina_Proizvodnje = godina;
procesor.Broj_Jezgri = jezgre;
procesor.Takt_Procesora = takt;
procesor.Cijena_Procesora = cijena;
enteties.Procesors.Add(procesor);
enteties.SaveChanges();
}
}
}
在我的表單中,我想向數據庫添加新的處理器,但我做不到
我的表格代碼:
public partial class Form1 : Form
{
RacunalaEntities context = new RacunalaEntities();
Procesori procesori = new Procesori();
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = procesori.DohvatiProcesore();
}
private void btnDodajProcesore_Click(object sender, EventArgs e)
{
string nazivProcesora = txtNazivProcesora.Text;
int godinaProizvodnje = int.Parse(txtGodinaProizvodnje.Text);
string nazivProizvodaca = txtNazivProizvodaca.Text;
decimal cijenaProcesora = decimal.Parse(txtCijenaProcesora.Text);
int brojJezgri = int.Parse(txtBrojJezgri.Text);
double taktProcesora = double.Parse(txtTaktProcesora.Text);
procesori.unosProcesora(nazivProcesora,godinaProizvodnje,nazivProizvodaca,cijenaProcesora,brojJezgri,taktProcesora);
MessageBox.Show("Podaci su spremljeni");
}
}
錯誤代碼:
PostgresException: 428C9: 無法插入列“ID”
嘗試使用以下屬性裝飾 Id 屬性。
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
雖然@Dominik 的回答解決了這個問題,但它似乎很忙,因為我的數據庫會變得很大。 我需要一個一次性的解決方案來永遠解決這個問題。 我檢查了EntityFramework6.npgsql
中的內容並發現了PgTableColumns
的DefiningQuery
(在Resources\NpgsqlSchema.ssdl
中找到)的問題,它沒有正確識別is_identity
屬性。 所以,我決定改變它並使用 dll 而不是 Nuget 的
select
cast(a.attrelid as varchar) || '.' || cast (a.attnum as varchar) as id,
cast(c.oid as varchar) as table_id,
a.attname as name,
a.attnum as ordinal,
not a.attnotnull as is_nullable,
t.typname as type_name,
case
when t.typname in ('bpchar', 'varchar') and a.atttypmod != -1 then a.atttypmod - 4
when t.typname in ('bit', 'varbit') and a.atttypmod != -1 then a.atttypmod
else null
end as max_length,
case
when t.typname = 'numeric' and a.atttypmod != -1 then ((a.atttypmod - 4) >> 16) & 65535
else null
end as precision,
case
when t.typname in ('time', 'timestamp', 'timestamptz') and a.atttypmod != -1 then a.atttypmod
when t.typname = 'interval' and a.atttypmod & 65535 != 65535 then a.atttypmod & 65535
else null
end as datetime_precision,
case
when t.typname = 'numeric' and a.atttypmod != -1 then (a.atttypmod - 4) & 65535
else null
end as scale,
case
when t.typlen = -1 and t.typelem != 0 then true
else false
end as is_multiset,
null as collation_catalog_name,
null as collation_schema_name,
null as collation_name,
null as char_set_catalog_name,
null as char_set_schema_name,
null as char_set_name,
case when (select is_identity from information_schema.columns k where nspname=k.table_schema and
a.attname=k.column_name and c.relname= k.table_name) ='YES' then true else false end is_identity,
false as is_generated,
-- default value column
pg_get_expr(ad.adbin, ad.adrelid) as default_value
from pg_attribute a
join pg_class c
on a.attrelid = c.oid
join pg_namespace n
on c.relnamespace = n.oid
join pg_type t
on a.atttypid = t.oid
left join pg_attrdef ad
on a.attrelid = ad.adrelid and a.attnum = ad.adnum
where t.typtype = 'b' and c.relkind = 'r' and a.attnum >= 0 and c.relnamespace in
(select oid from pg_namespace where nspname not in ('pg_catalog','information_schema','pg_toast'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.