簡體   English   中英

實體框架,保存新數據庫條目的問題

[英]Entity Framework, Problem with saving new database entry

我試圖保存我的新數據庫條目,但 ID 需要增加。

這是表列:

處理器表列

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; }

要解決此問題,首先將 go 放入您的 pgAdmin4 並設置列約束 Identity BY DEFAULT,如下所示:

列約束標識

之后 go 進入 Visual Studio 並打開 your.edmx model。 在我的情況下,在定義的表中,它是表“處理器”列“Id”打開屬性並將 Store Generated Pattern 設置為 IDENTITY,如下所示:

身份

現在一切正常,我的 ID 是自動遞增的:DI 使用的是數據庫優先方法。

雖然@Dominik 的回答解決了這個問題,但它似乎很忙,因為我的數據庫會變得很大。 我需要一個一次性的解決方案來永遠解決這個問題。 我檢查了EntityFramework6.npgsql中的內容並發現了PgTableColumnsDefiningQuery (在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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM