เหตุใด EF-entity ที่สร้างขึ้นใหม่จึงโยน ID จึงเป็นข้อยกเว้นเป็นโมฆะเมื่อพยายามบันทึก

ฉันกำลังทดลองใช้เฟรมเวิร์กเอนทิตีที่รวมอยู่ใน VS2010 แต่ประสบปัญหากับฐานข้อมูล/โมเดลของฉันที่สร้างจากอินเทอร์เฟซแบบกราฟิก

เมื่อฉันทำ:

user = dataset.UserSet.CreateObject();
user.Id = Guid.NewGuid();
dataset.UserSet.AddObject(user);
dataset.SaveChanges();

{"ไม่สามารถแทรกค่า NULL ลงในคอลัมน์ 'Id', ตาราง 'BarSoc2.dbo.UserSet'; คอลัมน์ไม่อนุญาตให้มีค่า null INSERT ล้มเหลว\r\nคำสั่งถูกยกเลิก"}

ตารางที่ฉันกำลังแทรกเข้าไปมีลักษณะดังนี้:

-- Creating table 'UserSet'
CREATE TABLE [dbo].[UserSet] (
    [Id] uniqueidentifier  NOT NULL,
    [Name] nvarchar(max)  NOT NULL,
    [Username] nvarchar(max)  NOT NULL,
    [Password] nvarchar(max)  NOT NULL
);
GO

-- Creating primary key on [Id] in table 'UserSet'
ALTER TABLE [dbo].[UserSet]
ADD CONSTRAINT [PK_UserSet]
    PRIMARY KEY CLUSTERED ([Id] ASC);
GO

ฉันกำลังสร้างวัตถุในทางที่ผิดหรือทำอะไรผิดขั้นพื้นฐานหรือไม่?


person richardwiden    schedule 15.05.2010    source แหล่งที่มา
comment
เหตุใดคุณจึงใช้ CreateObject() แทนที่จะเป็น UserSet ใหม่ ()   -  person Ian Mercer    schedule 15.05.2010
comment
ฉันคิดว่ามันเป็นวิธีที่ถูกต้องกว่านี้ ไม่จำเป็นเหรอ?   -  person richardwiden    schedule 15.05.2010


คำตอบ (2)


คุณไม่ควรต้องตั้งค่าคุณสมบัติ ID ด้วยตนเอง ควรตั้งค่าโดยอัตโนมัติเมื่อคุณบันทึก ฉันถือว่าคุณกำลังใช้เทมเพลตมาตรฐานสำหรับ Entity Framework และไม่ใช่เทมเพลตเอนทิตีการติดตามตนเองหรือเทมเพลต POCO หากเป็นเช่นนั้น บางสิ่งในบรรทัดต่อไปนี้อาจดูเหมาะสมกว่า:

User user = new User();
dataset.AddToUsers(user);
dataset.SaveChanges();
person Community    schedule 15.05.2010
comment
ขอบคุณ มันทำงานได้อย่างสมบูรณ์แบบ เห็นได้ชัดว่ามีบางอย่างผิดปกติเกิดขึ้นเมื่อคุณตั้งค่า ID ด้วยตัวเอง AddToUsers เลิกใช้แล้ว - person richardwiden; 15.05.2010

ในแบบจำลองสำหรับฟิลด์ที่กำหนดเป็นคีย์ ให้เพิ่มแอตทริบิวต์ต่อไปนี้ คีย์นี้ซึ่งไม่ได้ทำเครื่องหมายเป็น IDENTITY ในฐานข้อมูล Entity Framework ให้ข้อยกเว้น

[Key]
[Display(Name = "Id")]     
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]
public int Id { get; set; }
person varun sharma    schedule 11.01.2012