抱歉发布了看似重复的内容,但请耐心等待!
我第一次使用 Entity Framework 开发 Blazor .NET Core 应用程序。我的项目是基于Thomas Beck的project来自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 设置为“某处”,而我并没有尝试这样做我很担心。
有什么想法吗?
您的 Hymn 域对象可能正在从旧类别定义新类别,因此您会收到 SQL 服务器错误。