我是IdentityFramework的新手(核心版本和旧版本......)我真的不明白这一点: 我处于“数据库优先”状态,在db中有这两个链接表:items表有一个指向colors表的外键。 他们都有和Id IDENTITY PRIMARY KEY
CREATE TABLE [dbo].[colours](
[id] [int] IDENTITY(1,1) NOT NULL,
[description] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_colours] PRIMARY KEY
CREATE TABLE [dbo].[items](
[id] [int] IDENTITY(1,1) NOT NULL,
[description] [nvarchar](50) NULL,
[colour_id] [int] NOT NULL,
CONSTRAINT [PK_items] PRIMARY KEY
ALTER TABLE [dbo].[items] WITH CHECK ADD CONSTRAINT [FK_items_colours] FOREIGN KEY([colour_id])
REFERENCES [dbo].[colours] ([id])
ON UPDATE CASCADE
我使用Scaffold-DbContext实用程序生成了模型和dbContext类,这就是我获得的:
namespace GeaCollection.Data.Models
{
public partial class Colours
{
public Colours()
{
Items = new HashSet<Items>();
}
public int Id { get; set; }
public string Description { get; set; }
public virtual ICollection<Items> Items { get; set; }
}
}
namespace GeaCollection.Data.Models
{
public partial class Items
{
public int Id { get; set; }
public string Description { get; set; }
public int ColourId { get; set; }
public virtual Colours Colour { get; set; }
}
}
这是dbContext类的代码片段:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Colours>(entity =>
{
entity.ToTable("colours");
entity.Property(e => e.Id)
.HasColumnName("id");
entity.Property(e => e.Description)
.IsRequired()
.HasColumnName("description")
.HasMaxLength(50);
});
modelBuilder.Entity<Items>(entity =>
{
entity.ToTable("items");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.ColourId).HasColumnName("colour_id");
entity.Property(e => e.Description)
.HasColumnName("description")
.HasMaxLength(50);
entity.HasOne(d => d.Colour)
.WithMany(p => p.Items)
.HasForeignKey(d => d.ColourId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_items_colours");
});
现在说一个Web API控制器中的方法获取一个包含Item的序列化JSON(颜色的完整,我已经在db中拥有的颜色), 我必须将其插入数据库。
{
"id": 0,
"description": "item 1",
"colour": {
"id": 2,
"description": "colour 2",
}
}
private void test()
{
// the model remapped object
var item = new Items
{
Description = "Item 1",
Colour = new Colours { Id = 2, Description = "Colour 2" }
};
dbContext.Add(item);
dbContext.SaveChanges();
}
在Add方法之后,项目ColourId属性被正确地赋值,但是当我调用SaveChanges时,我得到以下异常:
'Microsoft.EntityFrameworkCore.DbUpdateException':
Quando IDENTITY_INSERT è OFF non è possibile inserire un valore esplicito per la colonna Identity nella tabella 'colours'.
即“当IDENTITY_INSERT为OFF时,您无法为'colors'表的Identity列插入显式值”。
当然,除了项目记录之外我不想INSERT,我认为框架本身可以匹配链接表中的现有颜色。
如果我直接设置ColourId属性,并让Color对象为NULL,我可以插入记录,但对我来说它看起来很奇怪。
我做错了什么?
谢谢 乔瓦尼