Blazor WASM SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“类别”中为标识列插入显式值

问题描述 投票:0回答:1

抱歉发布了看似重复的内容,但请耐心等待!

我第一次使用 Entity Framework 开发 Blazor .NET Core 应用程序。我的项目是基于Thomas Beckproject来自Github,我根据自己的需求修改了

我有两个多对多关系的实体:

public class Hymn
{
    public int HymnId { get; set; }
    public string Title { get; set;}
    public string Scale { get; set; }
    public string Lyrics { get; set; }
    public bool IsDeleting { get; set; }
    public virtual ICollection<Category> Categories { get; set; } = new List<Category>();
}

public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    [NotMapped]
    public bool IsSelected { get; set; }
    public virtual ICollection<Hymn> Hymns { get; set; } = new List<Hymn>();
}

我使用实体框架命令来创建和更新表,甚至用我的 SqlExpress 数据库中的数据填充它们。

现在,我有一个 .Razor 页面,我想在其中添加新的赞美诗。每首赞美诗都可以有一个或多个类别,表示为复选框列表。

<div class="form-group">
        <label>Categories:</label>
        @foreach (var category in Categories)
        {

            <div class="form-check">
                <input class="form-check-input" type="checkbox" id="@category.CategoryId" @onchange="@(e => HandleCategoryChange(category))" />
                <label class="form-check-label" for="@category.CategoryId">
                    @category.CategoryName
                </label>
            </div>
        }
</div>

和代码块

    @code {
    [Parameter]
    public string Page { get; set; } = "1";
    private Hymn Hymn = new Hymn();
    public ICollection<Category> Categories = new List<Category>();
    [Parameter]
    public string ButtonText { get; set; } = "Create Hymn";
    [Parameter]
    public bool loading {get; set;} = false;
    [Parameter]
    public EventCallback OnValidSubmit { get; set; }

    protected async override Task OnInitializedAsync()
    {
        Categories = await CategoryService.GetCategories(null, Page);
    }

    async Task CreateHymn()
    {
        loading = true;
        try
        {
            Hymn.Categories = Categories.Where(c => c.IsSelected).ToList();

            await HymnService.AddHymn(Hymn);

            AlertService.Success("Hymn added successfully", keepAfterRouteChange: true);
            if (PageHistoryState.CanGoBack())
            {
                navManager.NavigateTo(PageHistoryState.GetGoBackPage());
            }
            else
            {
                navManager.NavigateTo("/hymn/1");
            }
        }
        catch (Exception ex)
        {
            AlertService.Error(ex.Message);
            loading = false;
            StateHasChanged();
        }
    }

    void ToggleCategorySelection(Category category)
    {
        category.IsSelected = !category.IsSelected;
    }
}

Category 和 Hymn 有自己的服务来处理所有数据库操作。

以上所有作品发现,只要我不选择任何类别,当我选择一个或多个类别时,我得到提到的异常。

类别是在类别表中预先生成的,是我唯一想使用的类别,我不想每次创建新的赞美诗时都创建新的类别。

我理解问题的原因(或者至少我认为我理解),这是 SQL 不喜欢将 Category 实体的 CategoryId 设置为“某处”,而我并没有尝试这样做我很担心。

有什么想法吗?

entity-framework .net-core ef-code-first blazor-webassembly sql-server-express
1个回答
0
投票

您的 Hymn 域对象可能正在从旧类别定义新类别,因此您会收到 SQL 服务器错误。

© www.soinside.com 2019 - 2024. All rights reserved.