Я загружаю данные теста в две модели, Author
и Post
.Заполнение работает для Author
, но, похоже, не работает тихо для Post
.
Редактировать: Я думаю, что нашел источник проблемы.Я поймал исключение, и сообщение
Невозможно вставить явное значение для столбца идентификаторов в таблице Post
, если IDENTITY_INSERT
установлено в OFF.
Для этого может быть обходной путь в этом посте StackOverflow , но мне было интересно, есть ли у кого-нибудь идеи, почему это происходит?Это потому, что мы не должны вручную устанавливать значение первичного ключа?
Я теряю после этого руководства по Microsoft Docs , но использую ASP.NET MVC Core 2.1.Основная стратегия заключается в том, что метод Main()
в классе Program
вызывает DbInitializer.Initialize()
, который заполняет данные, если в контексте нет Authors
.
Я перешагнул через DbInitializer
класс, и код проходит через один и тот же процесс для обеих моделей, циклически проходя через заполненный массив, добавляя его в контекст и (видимо) сохраняя изменения.Однако, хотя поля базы данных Author
заполнены начальными данными, поля Post
- нет.
Редактировать: при просмотре и проверке созданного контекста иногда поля Author
имеют странные значения ID
, а иногда поля Post
имеют странные значения ID
: -2147492647, -2147492646 и т. Д.... Я пытался изменить PostID
на ID
при вероятности того, что это вызвало проблему, но та же проблема возникает с этим именем поля.
Моя вторая мысль - интересно, есть ли в этом что-тоделать с отношениями многие-к-одному между почтой и автором.Однако я попытался заполнить данные Post
только полем Title
(исключая внешний ключ AuthorID
), и это не имело значения.Я новичок в ASP.NET, поэтому я надеюсь, что мне не хватает чего-то очевидного.Спасибо за любое направление.
MyWebsiteContext.cs
using Microsoft.EntityFrameworkCore;
using MyWebsite.Models;
namespace MyWebsite.Models
{
public class MyWebsiteContext : DbContext
{
public MyWebsiteContext (DbContextOptions<MyWebsiteContext> options)
: base(options)
{
}
public DbSet<MyWebsite.Models.Author> Author { get; set; }
public DbSet<MyWebsite.Models.Post> Post { get; set; }
}
}
DbInitializer.cs
using MyWebsite.Models;
namespace MyWebsite.Data
{
public class DbInitializer
{
public static void Initialize(MyWebsiteContext context)
{
// Look for any authors; if none, seed DB.
if (context.Author.Any())
{
return; // DB has already been seeded.
}
var authors = new Author[]
{
new Author{ FirstName="Terry",LastName="Pratchett",SignUpDate=DateTime.Parse("2019-04-01")},
new Author{ FirstName="Neil",LastName="Gaiman",SignUpDate=DateTime.Parse("2019-03-02")},
};
foreach (Author a in authors)
{
context.Author.Add(a);
}
context.SaveChanges();
var posts = new Post[]
{
new Post{PostID=1,Title="Title of post 1"},
new Post{PostID=2,Title="Title of post 2"},
new Post{PostID=3,Title="Title of post 3"},
};
foreach (Post p in posts)
{
context.Post.Add(p);
}
context.SaveChanges();
}
}
}
Program.cs
using System;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MyWebsite.Data;
using MyWebsite.Models;
namespace MyWebsite
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<MyWebsiteContext>();
DbInitializer.Initialize(context);
}
catch(Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred creating the DB.");
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
Post.cs
namespace MyWebsite.Models
{
public class Post // Post entity is dependent on Author class
{
public int PostID { get; set; } // primary key
public string Title { get; set; }
public int AuthorID { get; set; } // foreign key
public Author Author { get; set; }
}
}
Author.cs
namespace MyWebsite.Models
{
public class Author
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime SignUpDate { get; set; }
}
}