英文:
ASP.NET Core 6 MVC data seeder not populating categories
问题
在下面的代码中,AppUser
和 Contact
被创建了,但Category
没有被创建。终端中的错误是...
> 列"Categories"的列"AppUserId"中的空值违反了非空约束
这是一个具有一对多关系的Postgresql数据库,包括 AppUser
到 Contact
和 AppUser
到 Category
。我可以在应用程序中成功创建一个类别,并且显示Name
和AppUser
字段都正确填充了,但出于某种原因Seeder没有执行相同的操作。
这很奇怪,因为联系人记录的AppUserId
正确填充了。我不明白为什么它不会为Category
记录执行相同的操作。有什么想法吗?
以下是代码:
using ContactPro.Data;
using ContactPro.Models;
using Microsoft.AspNetCore.Identity;
namespace ContactPro.Helpers
{
public class DataSeeder
{
private readonly ApplicationDbContext _dbContext;
private readonly UserManager<AppUser> _userManager;
private static string appUserId;
public DataSeeder(ApplicationDbContext dbContext, UserManager<AppUser> userManager)
{
_dbContext = dbContext;
_userManager = userManager;
}
public async Task SeedDataAsync()
{
await SeedUsersAsync();
await SeedContactsAsync();
await SeedCategoriesAsync();
}
private async Task SeedUsersAsync()
{
if (_dbContext.Users.Any())
{
return;
}
var demoUser = new AppUser()
{
UserName = "demouser@mail.com",
Email = "demouser@mail.com",
FirstName = "Demo",
LastName = "User",
EmailConfirmed = true,
};
await _userManager.CreateAsync(demoUser, "xxxxxx");
await _dbContext.SaveChangesAsync();
appUserId = _userManager.Users.FirstOrDefault(u => u.Email == "demouser@mail.com").Id;
}
private async Task SeedContactsAsync()
{
if (!_dbContext.Contacts.Any())
{
var contact = new List<Contact>()
{
new Contact()
{
FirstName = "John",
LastName = "Dickens",
Address1 = "12 Main St.",
City = "Concord",
States = ContactPro.Enums.States.NH,
ZipCode = 03101,
Email = "john@mail.com",
AppUserId = appUserId,
}
};
await _dbContext.Contacts.AddRangeAsync(contact);
await _dbContext.SaveChangesAsync();
}
}
private async Task SeedCategoriesAsync()
{
if (!_dbContext.Categories.Any())
{
var category = new List<Category>()
{
new Category()
{
Name = "_UnCategorized",
AppUserId = appUserId,
},
};
await _dbContext.Categories.AddRangeAsync(category);
await _dbContext.SaveChangesAsync();
}
}
}
}
英文:
In the code below the AppUser
and the Contact
are being created, but the Category
is not. The error in the terminal is...
> null value in column "AppUserId" of relation "Categories" violates not-null constraint
It is a Postgresql db with a one to many of AppUser
to Contact
, and AppUser
to Category
. I can create a category in the app ok, and it shows both the Name
and AppUser
fields populated correctly, but for some reason the seeder isn't doing that.
This is strange since the AppUserId
is correctly populated for the contact record. I can't understand why it would not do the same for the Category
record. Any ideas?
Here is the code:
using ContactPro.Data;
using ContactPro.Models;
using Microsoft.AspNetCore.Identity;
namespace ContactPro.Helpers
{
public class DataSeeder
{
private readonly ApplicationDbContext _dbContext;
private readonly UserManager<AppUser> _userManager;
private static string appUserId;
public DataSeeder(ApplicationDbContext dbContext, UserManager<AppUser> userManager)
{
_dbContext = dbContext;
_userManager = userManager;
}
public async Task SeedDataAsync()
{
await SeedUsersAsync();
await SeedContactsAsync();
await SeedCategoriesAsync();
}
private async Task SeedUsersAsync()
{
if (_dbContext.Users.Any())
{
return;
}
var demoUser = new AppUser()
{
UserName = "demouser@mail.com",
Email = "demouser@mail.com",
FirstName = "Demo",
LastName = "User",
EmailConfirmed = true,
};
await _userManager.CreateAsync(demoUser, "xxxxxx");
await _dbContext.SaveChangesAsync();
appUserId = _userManager.Users.FirstOrDefault(u => u.Email == "demouser@mail.com").Id;
}
private async Task SeedContactsAsync()
{
if (!_dbContext.Contacts.Any())
{
var contact = new List<Contact>()
{
new Contact()
{
FirstName = "John",
LastName = "Dickens",
Address1 = "12 Main St.",
City = "Concord",
States = ContactPro.Enums.States.NH,
ZipCode = 03101,
Email = "john@mail.com",
AppUserId = appUserId,
}
};
await _dbContext.Contacts.AddRangeAsync(contact);
await _dbContext.SaveChanges();
}
}
private async Task SeedCategoriesAsync()
{
if (!_dbContext.Categories.Any())
{
var category = new List<Category>()
{
new Category()
{
Name = "_UnCategorized",
AppUserId = appUserId,
},
};
await _dbContext.Categories.AddRangeAsync(category);
await _dbContext.SaveChanges();
}
}
}
}
答案1
得分: 1
在方法中添加日志1,然后在控制台打印appUserId。
英文:
Please add the log to the method, and then print the appUserId in the console.
My suggestion is to create a default value for the column or remove the not-null constraint from the column.
using ContactPro.Data;
using ContactPro.Models;
using Microsoft.AspNetCore.Identity;
namespace ContactPro.Helpers
{
public class DataSeeder
{
private readonly ILogger _logger;
private readonly ApplicationDbContext _dbContext;
private readonly UserManager<AppUser> _userManager;
private static string appUserId;
public DataSeeder(ApplicationDbContext dbContext, UserManager<AppUser> userManager,ILogger<DataSeeder> logger)
{
_dbContext = dbContext;
_userManager = userManager;
_logger = logger;
}
public async Task SeedDataAsync()
{
await SeedUsersAsync();
await SeedContactsAsync();
await SeedCategoriesAsync();
}
private async Task SeedUsersAsync()
{
if (_dbContext.Users.Any())
{
return;
}
var demoUser = new AppUser()
{
UserName = "demouser@mail.com",
Email = "demouser@mail.com",
FirstName = "Demo",
LastName = "User",
EmailConfirmed = true,
};
await _userManager.CreateAsync(demoUser, "xxxxxx");
await _dbContext.SaveChangesAsync();
_logger.LogInformation("****** at {DT}",
DateTime.UtcNow.ToLongTimeString());
appUserId = _userManager.Users.FirstOrDefault(u => u.Email == "demouser@mail.com").Id;
_logger.LogInformation("****** at {DT}",
DateTime.UtcNow.ToLongTimeString());
}
private async Task SeedContactsAsync()
{
_logger.LogInformation("****** at {DT}",
DateTime.UtcNow.ToLongTimeString());
if (!_dbContext.Contacts.Any())
{
var contact = new List<Contact>()
{
new Contact()
{
FirstName = "John",
LastName = "Dickens",
Address1 = "12 Main St.",
City = "Concord",
States = ContactPro.Enums.States.NH,
ZipCode = 03101,
Email = "john@mail.com",
AppUserId = appUserId,
}
};
_logger.LogInformation("****** at {DT}",
DateTime.UtcNow.ToLongTimeString());
await _dbContext.Contacts.AddRangeAsync(contact);
await _dbContext.SaveChanges();
}
}
private async Task SeedCategoriesAsync()
{
_logger.LogInformation("****** at {DT}",
DateTime.UtcNow.ToLongTimeString());
if (!_dbContext.Categories.Any())
{
var category = new List<Category>()
{
new Category()
{
Name = "_UnCategorized",
AppUserId = appUserId,
},
};
_logger.LogInformation("****** at {DT}",
DateTime.UtcNow.ToLongTimeString());
await _dbContext.Categories.AddRangeAsync(category);
await _dbContext.SaveChanges();
}
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论