.net核心EF核心多对多插入

时间:2018-12-13 18:05:02

标签: c# many-to-many entity-framework-core

public class Article
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public string Lead { get; set; }
    [Required]
    public string Content { get; set; }
    [Required]
    public bool IsPublished { get; set; }

    public int CategoryId { get; set; }
    public Category Category { get; set; }
    public IList<ArticleTags> ArticleTags { get; set; }
}

public class Tag
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public IList<ArticleTags> ArticleTags { get; set; }
}


public class ArticleTags
{
    public int ArticleId { get; set; }
    public Article Article { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

为什么其余的请求不起作用?

{
    "Title":"tit",
    "Lead":"lead",
    "Content":"c ",
    "IsPublished":false,
    "Category":{
        "Name":"Cat"
    },
    "ArticleTags":[
        {
            "Name":"tag1"
        },
        {
            "Name":"tag2"
        }   
    ]

}

遇到此错误

  

实体类型ArticleTags上的属性ArticleId具有一个临时值。要么显式设置一个永久值,要么确保将数据库配置为为此属性生成值。

理想情况下,我希望我的休息请求看起来像这样

{
    "Title":"tit",
    "Lead":"lead",
    "Content":"c ",
    "IsPublished":false,
    "Category":{
        "Name":"Cat"
    },
    "ArticleTags":[
        1,2,3,4,5   
    ]

}

我可以在其中放置已经存在的标签的ID,那么我该如何写我的多对多关系?

我应该改变方法并创建ArticleRest类,仅获取标记ID的列表,然后手动将其插入到我的ArticleTags表中吗?

1 个答案:

答案 0 :(得分:0)

要考虑的事情是EF Core不支持多对多关系,因此您需要一个看起来确实有的联接表。

所以另一件事是您可能没有设置从Article到ArticleTag的外键关系

脚本应如下所示:

CREATE TABLE [dbo].[ArticleTags] (
[ArticleTagId] INT IDENTITY(1,1) NOT NULL,
[ArticleId]    INT NOT NULL,
[TagId]        INT NOT NULL,
CONSTRAINT [PK_ArticleTags_ArticleTagId] PRIMARY KEY CLUSTERED ([ArticleTagId] ASC),
CONSTRAINT [FK_Article_ArticleId_ArticleTags_ArticleId] FOREIGN KEY ([ArticleId]) REFERENCES [dbo].[Article] ([ArticleId]),
CONSTRAINT [FK_Tag_TagId_ArticleTags_TagId] FOREIGN KEY ([TagId]) REFERENCES [dbo].[Tag] ([TagId]),
)

应该解决问题。

如果不对this进行阅读,将会有所帮助