Bia*_*ity 7 database asp.net entity-framework asp.net-web-api asp.net-core
假设我在EF生成的数据库中有一个Todo带有相应Todotable(DbSet<Todo>)的模型.该表将每行存储待办事项.每个用户(在ASP.NET Core Identity + IdentityServer应用程序中)将与多个待办事项相关联(一对多,用户可以有多个待办事项).
我这样做的方法是向模型添加一个UserId外键Todo,代表拥有待办事项的用户.
在使用ASP.NET核心标识证明的类时,如何使用EF Core?我的直觉是将以下内容添加到Todo类模型中:
public string UserId { get; set; }
[ForeignKey("UserId")]
public ApplicationUser User { get; set; }
Run Code Online (Sandbox Code Playgroud)
这使用ApplicationUser(ASP.NET Core Identity默认用户类模型)作为发现来填充UserId外键.
这是问题所在:当我跑步时Update-Database我得到一个错误!它说The entity type 'IdentityUserLogin<string>' requires a primary key to be defined..
浏览代码IdentityUserLogin,我可以看到它有一个UserId应该被视为主键的属性,对吧?
总之,以确保其作为主键注册,我加入这个代码ApplicationUser的OnModelCreating方法:builder.Entity<ApplicationUser>().HasKey(u => u.Id);.我仍然得到同样的错误!不知道我在这里做错了什么:(.编辑:是的,我打电话给基类,这不是问题所在.
注意:我知道我可以为每个携带todo项目ID集合的用户添加一个字段,而不是使用外键,但我不确定这是否是这样做的好方法.对此问题的指导表示赞赏.
Dav*_*ten 10
你没有为此共享代码,但我猜你已经OnModelCreating在db上下文中进行了覆盖,但是没有调用base.OnModelCreating(modelBuilder);.
如果没有基本调用,则您的上下文不会应用与身份相关的架构.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Add Identity related model configuration
base.OnModelCreating(modelBuilder);
// Your fluent modeling here
}
Run Code Online (Sandbox Code Playgroud)
编辑:感觉就像给这个旋转所以我只是执行了以下任务.TLDR将是它为我解决的问题.我相信你所遇到的问题与你正在制作的密钥无关,而与你无关的东西会导致你的失败,因为你所获得的失败与你正在构建模式的表完全不同.
我使用Identity创建了一个新的.net核心Web应用程序.我做的第一件事是调用update-database来从项目附带的初始迁移中构建数据库.这很有效.
接下来我添加了一个Todo课程.没有属性,只有Id和用户字段.甚至没有标记外键.
public class Todo
{
public int Id { get; set; }
public string UserId { get; set; }
public ApplicationUser User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我将它作为DbSet添加到ApplicationDbContext中.只更改上下文是添加ToDo DbSet
然后我调用add-migration todo了包管理器控制台来构建todo迁移.它与FK一起按预期生成.
public partial class Todo : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Todos",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
UserId = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Todos", x => x.Id);
table.ForeignKey(
name: "FK_Todos_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_Todos_UserId",
table: "Todos",
column: "UserId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Todos");
}
}
Run Code Online (Sandbox Code Playgroud)
然后我向我的About控制器操作添加了一些代码,只是将记录粘贴到表中以确保FK正常工作.它是.
public async Task<IActionResult> About()
{
var user = await _userManager.GetUserAsync(HttpContext.User);
var todo = new Todo
{
User = user
};
_context.Todos.Add(todo);
await _context.SaveChangesAsync();
return View();
}
Run Code Online (Sandbox Code Playgroud)
除了显而易见的是你的Todo课程中有更多的字段,你有不同的东西,你做了不同的事情,可能会导致我们的问题?
| 归档时间: |
|
| 查看次数: |
9086 次 |
| 最近记录: |