EntityFrameworkCore,在包含外键

时间:2016-12-18 14:49:41

标签: foreign-keys entity-framework-core identity-column

我是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,我可以插入记录,但对我来说它看起来很奇怪。

我做错了什么?

谢谢 乔瓦尼

0 个答案:

没有答案