Saya memiliki kesalahan di bawah ini ketika saya menjalankan script berikut. Apa kesalahan tentang, dan bagaimana hal itu dapat diselesaikan?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
Kesalahan:
Server: Msg 544, Tingkat 16, Negara bagian 1, Baris 1
Tidak dapat menyisipkan eksplisit nilai untuk kolom identitas pada tabel 'table' ketika IDENTITY_INSERT diatur ke OFF.
Anda're memasukkan nilai-nilai untuk OperationId
itu adalah kolom identitas.
Anda dapat mengaktifkan identitas insert pada tabel seperti ini sehingga anda dapat menentukan sendiri nilai-nilai identitas.
SET IDENTITY_INSERT Table1 ON
INSERT INTO Table1
/*Note the column list is REQUIRED here, not optional*/
(OperationID,
OpDescription,
FilterID)
VALUES (20,
'Hierachy Update',
1)
SET IDENTITY_INSERT Table1 OFF
Sangat waspada terhadap pengaturan IDENTITY_INSERT untuk DI. Ini adalah praktek yang buruk kecuali database dalam modus pemeliharaan dan ditetapkan untuk satu pengguna. Ini tidak hanya mempengaruhi anda masukkan, tapi bagi orang lain yang mencoba untuk mengakses tabel.
Mengapa anda mencoba untuk menempatkan nilai ke bidang identitas?
Hanya Jika anda mendapatkan kesalahan ini pada SQL server kemudian jalankan query ini-
SET IDENTITY_INSERT tableName ON
ini bekerja hanya satu tabel databse
e.g Jika nama tabel mahasiswa maka query akan terlihat seperti ini SET IDENTITY_INSERT siswa PADA
Jika anda mendapatkan kesalahan ini pada aplikasi web anda atau anda menggunakan entity framework kemudian menjalankan query di SQL server dan Update badan model (
.edmx file
) dan membangun proyek dan kesalahan ini akan diselesaikan
Pada dasarnya ada 2 cara yang berbeda untuk MENYISIPKAN catatan tanpa kesalahan:
Ketika IDENTITY_INSERT berangkat. KUNCI PRIMER "ID" TIDAK HARUS HADIR
Ketika IDENTITY_INSERT diatur PADA. KUNCI PRIMER "ID" HARUS HADIR
Sesuai contoh berikut dari Tabel yang sama yang dibuat dengan IDENTITAS PRIMARY KEY:
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE');
INSERT INTO Persons (FirstName,LastName)
VALUES ('JOE','BROWN');
OUTPUT dari TABLE [dbo].[Orang-orang] akan:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE');
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK');
OUTPUT dari TABLE [dbo].[Orang-orang] akan:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
Di badan anda untuk meja, tambahkan DatabaseGenerated
atribut di atas kolom identitas yang menyisipkan diatur:
Contoh:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
anda hanya dapat menggunakan pernyataan Ini untuk contoh jika nama tabel adalah Sekolah. Sebelum penyisipan pastikan identity_insert diatur ke DI dan setelah menyisipkan query mengubah identity_insert OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
Jika anda menggunakan liquibase untuk update SQL Server anda, anda mungkin mencoba untuk memasukkan record key menjadi autoIncrement field. Dengan menghapus kolom dari insert, naskah anda harus menjalankan.
<changeSet id="CREATE_GROUP_TABLE" >
<createTable tableName="GROUP_D">
<column name="GROUP_ID" type="INTEGER" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
</createTable>
</changeSet>
<changeSet id="INSERT_UNKNOWN_GROUP" >
<insert tableName="GROUP_D">
<column name="GROUP_ID" valueNumeric="-1"/>
...
</insert>
</changeSet>
Ada pra-disebutkan OperationId dalam kueri anda yang tidak harus ada karena itu adalah auto increamented
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
jadi permintaan anda akan
Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
Situasi lain adalah untuk memeriksa bahwa Kunci Utama adalah sama nama seperti dengan kelas anda di mana satu-satunya perbedaan adalah bahwa anda primary key memiliki 'ID' ditambahkan untuk itu atau untuk menentukan [Key] pada kunci primer yang tidak terkait dengan bagaimana kelas ini bernama.
Solusi terbaik adalah dengan menggunakan penjelasan GeneratedValue(strategi = ...)
, yaitu
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
ia mengatakan, bahwa kolom ini dihasilkan oleh database menggunakan IDENTITAS strategi dan anda don't perlu untuk mengurus - database akan melakukannya.
[DatabaseGenerated(DatabaseGeneratedOption.Identitas)]
di PrimaryKey kolom dan pastikan set ke tipe data int. Jika kolom primary key dan IsIDentity untuk benar dalam SQL tidak perlu untuk baris kode [DatabaseGenerated(DatabaseGeneratedOption.Identitas)]
[DatabaseGenerated(DatabaseGeneratedOption.Identitas)]
I'm tidak yakin apa yang digunakan untuk "Sisipkan Tabel", tapi jika anda're hanya mencoba untuk memasukkan beberapa nilai-nilai yang coba:
Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);
Saya mendapat pesan kesalahan yang sama datang, tapi saya pikir ini harus bekerja. ID harus auto-increment otomatis selama itu's primary key.
Masalah yang diangkat dari menggunakan non-diketik DBContext atau DBSet jika anda menggunakan Antarmuka dan menerapkan metode savechanges di generik-cara
Jika ini adalah kasus anda, saya mengusulkan untuk diketik kuat DBContex misalnya
MyDBContext.MyEntity.Add(mynewObject)
kemudian .Savechanges
akan bekerja
Hanya menghapus tabel yang diseret ke anda .dbml file dan kembali menyeret mereka lagi. Maka solusi yang Bersih>solusi Membangun kembali> Membangun solusi.
Thats apa yang bekerja untuk saya.
Saya tidak membuat tabel pada saya sendiri, saya menggunakan LENSA dan SSMS, saya mengikuti link ini untuk ASP.NET Identity:https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project