首页 > 解决方案 > 实体框架,保存新数据库条目的问题

问题描述

我试图保存我的新数据库条目,但 ID 想要增加。

这是表格列:

处理器表列

ID 约束

我正在使用实体框架和 Windows 窗体。添加我的 postgresql 数据库后,它创建了 Procesor 类。

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 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”列

标签: c#postgresql

解决方案


虽然@Dominik 的回答解决了这个问题,但它似乎很忙,因为我的数据库会很大。我需要一个一次性的解决方案来永远解决这个问题。我检查了 's 中的内容EntityFramework6.npgsql并发现了PgTableColumns's 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) &amp; 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 &amp; 65535 != 65535 then a.atttypmod &amp; 65535
      else null
    end as datetime_precision,
    case
      when t.typname = 'numeric' and a.atttypmod != -1 then (a.atttypmod - 4) &amp; 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'))

推荐阅读