在 Azure Function 项目中引用来自 ASP.Net MVC 项目的实体时出错
Error when referencing entities from ASP.Net MVC project in Azure Function project
我有一个 ASP.Net MVC 项目,其中包含我的数据库实体,我的上下文使用 IdentityDbContext applicationuser
public class MyprojectContext : IdentityDbContext<ApplicationUser>
连接和获取数据库数据一切正常!
我还有一个 azure 函数项目来执行工作,我需要访问数据库(使用 entity framework)并获取不同的实体数据。所以我在 Azure Function 应用程序中引用了 MVC 应用程序,这样我就可以拥有所有 entities/classes.
但是当我尝试将数据提取到其中一个实体时 'YogaSpaceEvent' 我收到以下错误,如果我在 Azure 函数代码中创建自己的实体(请参见下面的代码)它工作正常并获取数据。
我猜这可能与每个成员使用
在 MVC 应用程序中获取数据有关
IdentityDbContext<ApplicationUser>
并且在 Azure Function 应用程序中我只使用 DbContext?????
System.Data.Entity.ModelConfiguration.ModelValidationException: 'One or more validation errors were detected during model generation:
PostEventEmail.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.
namespace PostEventEmail
{
public static class PostEventEmail
{
[FunctionName("PostEventEmail")]
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
YogaSpaceEvent newEvent = new YogaSpaceEvent(); // references the Asp.Net MVC app entity
using (var dbContext = new YogabandyContext())
{
var ybEvents = dbContext.YogaSpaceEvent.FirstOrDefault();
log.Info("event id = " + ybEvents.YogaSpaceEventId);
}
}
// if I uncomment this and use it, it works fine and fetches data
//public class YogaSpaceEvent
//{
// public int YogaSpaceEventId { get; set; }
//}
public partial class YogabandyContext : DbContext
{
public YogabandyContext()
: base("Server=tcp:yoga2017.database.windows.net,1433;Initial Catalog=Yoga2017;Persist Security Info=False;User ID=chuckd;Password=**********!;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;")
{
}
public DbSet<YogaSpaceEvent> YogaSpaceEvent { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//base.OnModelCreating(modelBuilder);
}
}
}
}
根据您的描述,我使用 ASP.NET Identity 创建了 Asp.Net MVC 应用程序来检查这个问题。我在我的 MVC 项目中创建了 YogaSpaceEvent
并定义了 DBContext 如下:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<YogaSpaceEvent> YogaSpaceEvent { get; set; }
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public ApplicationDbContext(string connectionString) : base(connectionString, throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
public class YogaSpaceEvent
{
public int YogaSpaceEventId { get; set; }
public string YogaSpaceEventName { get; set; }
public DateTime CreateTime { get; set; }
}
对于我的 Azure 函数,我只是引用了 MVC 项目并使用 ApplicationDbContext
从我的数据库访问实体,如下所示:
public static void Run([TimerTrigger("*/20 * * * * *")]TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
var connString=ConfigurationManager.AppSettings["sqldb-connectionstring"];
using (var dbContext = new ApplicationDbContext(connString))
{
var ybEvents = dbContext.YogaSpaceEvent.FirstOrDefault();
log.Info("event id = " + ybEvents?.YogaSpaceEventId);
}
}
local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=AccountName;AccountKey=AccountKey",
"AzureWebJobsDashboard": "DefaultEndpointsProtocol=https;AccountName=AccountName;AccountKey=AccountKey",
"sqldb-connectionstring": "Data Source=.\sqlexpress;Initial Catalog=DefaultConnection;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
}
}
它可以在我这边工作。这是我的代码sample,你可以参考一下。另外,你的错误很奇怪,你需要检查你的代码或者提供一个示例工程让我们重现这个问题。
我有一个 ASP.Net MVC 项目,其中包含我的数据库实体,我的上下文使用 IdentityDbContext applicationuser
public class MyprojectContext : IdentityDbContext<ApplicationUser>
连接和获取数据库数据一切正常!
我还有一个 azure 函数项目来执行工作,我需要访问数据库(使用 entity framework)并获取不同的实体数据。所以我在 Azure Function 应用程序中引用了 MVC 应用程序,这样我就可以拥有所有 entities/classes.
但是当我尝试将数据提取到其中一个实体时 'YogaSpaceEvent' 我收到以下错误,如果我在 Azure 函数代码中创建自己的实体(请参见下面的代码)它工作正常并获取数据。
我猜这可能与每个成员使用
在 MVC 应用程序中获取数据有关IdentityDbContext<ApplicationUser>
并且在 Azure Function 应用程序中我只使用 DbContext?????
System.Data.Entity.ModelConfiguration.ModelValidationException: 'One or more validation errors were detected during model generation: PostEventEmail.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.
namespace PostEventEmail
{
public static class PostEventEmail
{
[FunctionName("PostEventEmail")]
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
YogaSpaceEvent newEvent = new YogaSpaceEvent(); // references the Asp.Net MVC app entity
using (var dbContext = new YogabandyContext())
{
var ybEvents = dbContext.YogaSpaceEvent.FirstOrDefault();
log.Info("event id = " + ybEvents.YogaSpaceEventId);
}
}
// if I uncomment this and use it, it works fine and fetches data
//public class YogaSpaceEvent
//{
// public int YogaSpaceEventId { get; set; }
//}
public partial class YogabandyContext : DbContext
{
public YogabandyContext()
: base("Server=tcp:yoga2017.database.windows.net,1433;Initial Catalog=Yoga2017;Persist Security Info=False;User ID=chuckd;Password=**********!;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;")
{
}
public DbSet<YogaSpaceEvent> YogaSpaceEvent { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//base.OnModelCreating(modelBuilder);
}
}
}
}
根据您的描述,我使用 ASP.NET Identity 创建了 Asp.Net MVC 应用程序来检查这个问题。我在我的 MVC 项目中创建了 YogaSpaceEvent
并定义了 DBContext 如下:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<YogaSpaceEvent> YogaSpaceEvent { get; set; }
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public ApplicationDbContext(string connectionString) : base(connectionString, throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
public class YogaSpaceEvent
{
public int YogaSpaceEventId { get; set; }
public string YogaSpaceEventName { get; set; }
public DateTime CreateTime { get; set; }
}
对于我的 Azure 函数,我只是引用了 MVC 项目并使用 ApplicationDbContext
从我的数据库访问实体,如下所示:
public static void Run([TimerTrigger("*/20 * * * * *")]TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
var connString=ConfigurationManager.AppSettings["sqldb-connectionstring"];
using (var dbContext = new ApplicationDbContext(connString))
{
var ybEvents = dbContext.YogaSpaceEvent.FirstOrDefault();
log.Info("event id = " + ybEvents?.YogaSpaceEventId);
}
}
local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=AccountName;AccountKey=AccountKey",
"AzureWebJobsDashboard": "DefaultEndpointsProtocol=https;AccountName=AccountName;AccountKey=AccountKey",
"sqldb-connectionstring": "Data Source=.\sqlexpress;Initial Catalog=DefaultConnection;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
}
}
它可以在我这边工作。这是我的代码sample,你可以参考一下。另外,你的错误很奇怪,你需要检查你的代码或者提供一个示例工程让我们重现这个问题。