EF6 + Postgres 关系 dbo.AspNetUsers 不存在

postgresql

1个回答

写回答

只只年糕

2025-07-07 04:30

+ 关注

PostgreSQL
PostgreSQL

EF6 + Postgres:解决 dbo.AspNetUsers 关系缺失问题

在使用Entity Framework 6(EF6)与PostgreSQL数据库进行开发时,我们可能会遇到 dbo.AspNetUsers 关系不存在的问题。这是因为在PostgreSQL中,不同于其他关系型数据库,不使用dbo作为默认模式。

在本文中,我们将探讨如何解决 dbo.AspNetUsers 关系缺失问题,并给出相应的案例代码,帮助开发者更好地理解和应用。

问题背景

在使用EF6与PostgreSQL进行开发时,我们通常会遇到使用Identity进行用户认证和授权的情况。在这种情况下,我们需要在数据库中创建一个名为AspNetUsers的表,用于存储用户信息。

然而,在PostgreSQL中,默认的模式不是dbo,而是public。因此,当我们尝试使用EF6的Code First迁移功能创建数据库时,会出现 dbo.AspNetUsers 关系不存在的错误。

解决方案

要解决 dbo.AspNetUsers 关系缺失的问题,我们需要进行以下步骤:

第一步:更改默认模式

首先,我们需要将默认模式从public更改为dbo。可以在 EF6 的 DbContext 类中添加以下代码:

csharp

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.HasDefaultSchema("dbo");

base.OnModelCreating(modelBuilder);

}

这将确保在迁移过程中使用 dbo 模式。

第二步:手动创建 dbo.AspNetUsers 表

接下来,我们需要手动创建 dbo.AspNetUsers 表,以便EF6能够正确识别和使用它。在PostgreSQL中,我们可以使用以下SQL语句创建表:

sql

CREATE TABLE dbo.AspNetUsers

(

Id SERIAL PRIMARY KEY,

UserName VARCHAR(255),

EmAIl VARCHAR(255),

PasswordHash VARCHAR(255)

);

第三步:迁移数据库

完成上述步骤后,我们可以使用EF6的Code First迁移功能来创建数据库。打开Package Manager Console,执行以下命令:

Add-Migration InitialCreate

Update-Database

这将自动将我们在代码中定义的模型与数据库同步,并创建 dbo.AspNetUsers 表。

案例代码

下面是一个简单的示例代码,演示了如何使用EF6与PostgreSQL进行用户认证和授权:

csharp

using Microsoft.AspNet.Identity.EntityFramework;

using System.Data.Entity;

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

{

public ApplicationDbContext() : base("name=DefaultConnection") { }

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.HasDefaultSchema("dbo");

base.OnModelCreating(modelBuilder);

}

}

public class ApplicationUser : IdentityUser { }

public class UserRepository

{

private readonly ApplicationDbContext _context;

public UserRepository(ApplicationDbContext context)

{

_context = context;

}

public void CreateUser(ApplicationUser user)

{

_context.Users.Add(user);

_context.SaveChanges();

}

public ApplicationUser GetUserById(string id)

{

return _context.Users.Find(id);

}

public void UpdateUser(ApplicationUser user)

{

_context.Entry(user).State = EntityState.Modified;

_context.SaveChanges();

}

public void DeleteUser(ApplicationUser user)

{

_context.Users.Remove(user);

_context.SaveChanges();

}

}

// 在其他地方使用 UserRepository 进行用户操作

以上代码展示了如何创建一个基于EF6和Identity的应用程序,并在PostgreSQL中使用 dbo.AspNetUsers 表进行用户操作。

在使用EF6与PostgreSQL进行开发时,我们可能会遇到 dbo.AspNetUsers 关系缺失的问题。通过更改默认模式、手动创建表并进行数据库迁移,我们可以解决这个问题。希望本文对你理解和解决这个问题有所帮助。

参考文献:

- [Entity Framework 6 with PostgreSQL and Npgsql](https://www.npgsql.org/ef6/index.html)

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号