gpt4 book ai didi

c# - ApplicationUser 不是当前上下文模型的一部分

转载 作者:行者123 更新时间:2023-11-30 17:44:13 24 4
gpt4 key购买 nike

我有一个从同事那里得到的 ASP MVC 项目,它有 2 个上下文。一个来自登录所需的模板,另一个是自制的。所以我想把两者结合起来,但我总是收到这个错误:

ApplicationUser is not part of the model for the current context

模型是数据库优先。我首先制作了我的 SQL 表,然后制作了一个 ADO.NET 实体数据模型,它给出了我的这个 connectionString:

<add name="DairyCowBarnEntities" connectionString="metadata=res://*/Models.DairyCowBarnModel.csdl|res://*/Models.DairyCowBarnModel.ssdl|res://*/Models.DairyCowBarnModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=server;initial catalog=DairyCowBarn;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

在此数据库中,添加了所需的 ASP.NET 表,并且还在数据模型中。我通过迁移添加了 ASP.NET 表。

这是我的 DbContext 类:

public partial class DairyCowBarnEntities : IdentityDbContext<ApplicationUser>
{
public DairyCowBarnEntities()
: base("name=DairyCowBarnEntities")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}

public static DairyCowBarnEntities Create()
{
return new DairyCowBarnEntities();
}

public virtual DbSet<C__MigrationHistory> C__MigrationHistory { get; set; }
public virtual DbSet<C__RefactorLog> C__RefactorLog { get; set; }
public virtual DbSet<AspNetRole> AspNetRoles { get; set; }
public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; }
public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; }
public virtual DbSet<AspNetUser> AspNetUsers { get; set; }

public virtual DbSet<jntConcentrateMixture> jntConcentrateMixtures { get; set; }
public virtual DbSet<jntConsistingParcel> jntConsistingParcels { get; set; }

}

我读到 ApplicationUser 需要像这样的普通 connectionString:

<add name="DairyCowBarnEntities" connectionString="Data Source=server;Initial Catalog=DairyCowBarn;Integrated Security=True" providerName="System.Data.SqlClient" />

但是我得到了这个错误:

The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development.  This will not work correctly. To fix this problem do not remove the line of code that throws this exception. If you wish to use Database First or Model First, then make sure that the Entity Framework connection string is included in the app.config or web.config of the start-up project. If you are creating your own DbConnection, then make sure that it is an EntityConnection and not some other type of DbConnection, and that you pass it to one of the base DbContext constructors that take a DbConnection.

我不知道如何将两者结合起来。我没主意了。非常感谢和真正需要任何帮助。希望我解释清楚了。否则,只需询问是否需要更多信息。

最佳答案

当您对数据库进行逆向工程时,它会提取您不需要的 AspNet 表。关于身份验证,您唯一需要的模型是

public class ApplicationUser : IdentityUser
{
public DateTimeOffset CreatedOn { get; set; }

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}

我已经在我的 AspNetUsers 表中添加了一个 CreatedOn 列,这就是它出现在上述模型中的原因。下一步是确保您的 DbContext 派生自 IdentityDbContext<ApplicationUser> .该基类将处理到您的 AspNet 表的映射。所以你的 DbContext 应该是这样的:

public partial class DairyCowBarnEntities : IdentityDbContext<ApplicationUser>
{
public DairyCowBarnEntities()
: base("name=DairyCowBarnEntities")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}

public static DairyCowBarnEntities Create()
{
return new DairyCowBarnEntities();
}

public virtual DbSet<jntConcentrateMixture> jntConcentrateMixtures { get; set; }
public virtual DbSet<jntConsistingParcel> jntConsistingParcels { get; set; }

}

这样做吧,删除所有关于您的 AspNet 的模型以及代码中对这些模型的所有引用。添加 ApplicationUser 模型但不为其创建 DbSet 并将其传递到派生类中 IdentityDbContext<ApplicationUser> . IdentityDbContext 将处理有关身份验证和授权的所有事情,因此您可以正常使用 UserManager 和 Identity。

请注意,我的 CreatedOn 是使用默认值 (sysdatetimeoffset()) 生成的数据库,但从未起作用。我必须在代码中显式设置 CreatedOn,或者将其填充到数据库中作为 DateTimeOffset.MinValue。

已更新以回答评论:

IdentityDbContext<ApplicationUser>您的数据库上下文派生自为您处理该映射。它提供了一个抽象层,所以你不必担心它。如果您需要查询那些超出 UserManager 将为您做的表,即;获取所有未确认的用户电子邮件地址,您始终可以编写自己的选择语句并将其传递到您的 dbContext 中,如 dbContext.Database.SqlQuery<T>(sqlQuery, false); T 在这种情况下将是您创建的模型,它应该具有与您正在查询的列名相同的属性名称和类型。 示例如下

public Users
{
public string UserName { get; set; }
public bool EmailConfirmed { get; set; }
}

var sqlQuery = "SELECT Users.UserName, Users.EmailConfirmed FROM AspNetUsers WHERE Users.EmailConfirmed = {0}"
var unconfirmedUsers = dbContext.Database.SqlQuery<Users>(sqlQuery, false).ToList();

使用 {0}并将该值作为参数传递将自动清理该值,因此任何 sql 注入(inject)脚本都不会起作用。

关于c# - ApplicationUser 不是当前上下文模型的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com