实体框架 SQL 和 SQLite 混淆:ModelValidationException

Posted

技术标签:

【中文标题】实体框架 SQL 和 SQLite 混淆:ModelValidationException【英文标题】:Entity framework SQL and SQLite mixed up : ModelValidationException 【发布时间】:2021-12-14 10:21:26 【问题描述】:

我遇到了实体框架的问题。我设法缩小了范围。

我有一个 Web 项目(带有 SQL 实体框架 6 的 Asp.net MVC 5)。我创建了一个简单的测试项目来执行此操作(它仅引用 Web 项目和所需的实体框架 nuget):

    using (var context = new ApplicationDbContext())
    
        context.Database.Delete();
        context.Database.Create();
    

一切正常。现在,我有一个带有 SQLite 的 Xamarin 项目。我在这个项目中没有使用实体框架。我想在我的测试项目中引用它来测试移动代码和网站代码之间的交互。 一旦我引用 Xamarin 项目,测试就会失败

    Test method Tests.UnitTest1.DbTest2 threw exception: 
System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation:

Website.Models.ApplicationDbContext.xxx: : EntityType 'Xx' has no key defined. Define the key for this EntityType.
xxxs: EntityType: EntitySet 'xxxs' is based on type 'Xx' that has no keys defined.

总结一下,我有 3 个项目:

Web 项目(使用 Entity Framework 6 for SQL) 单元测试项目 使用 SQLite 的 Xamarin 项目

如果单元测试引用 Xamarin 项目。测试没问题。

如果单元测试引用 Xamarin 项目。测试失败。

如果我不使用 Sqlite 引用 Xamarin 项目,该模型可以正常工作。然而,它就在这里。

public class Xx

    public Xx()
    
    
    
    [Key, ForeignKey("ApplicationUser")]
    public string ApplicationUserId  get; set; 
    
    [UIHint("UserProfile")]
    [JsonIgnore] 
    public virtual ApplicationUser ApplicationUser  get; set; 
    

【问题讨论】:

“测试移动端代码和网站代码的交互”——这不是单元测试 @Jason 这更像是行为驱动测试。 【参考方案1】: 仅当您的数据库生成 id 时才使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)],如果不只使用 [Key] 属性。
[Table("xxx")]
public class xxx

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public string ApplicationUserId  get; set; 
    ....

为了使用复合键,Entity Framework 要求您定义键属性的顺序。您可以通过使用 Column 注释来指定顺序来做到这一点。

当您配置一对一关系时,实体框架要求依赖的主键也是外键。

您可以在 EntityFramework.dll 的 System.ComponentModel.DataAnnotations.Schema 命名空间中使用 [NotMapped] 属性。

问题是EF只有知道表的主键才能工作。默认情况下,EF 将其识别为名称为 Id 的主键属性。如果你的表有另一个主键,你可以用属性[Key]标记它,或者用流畅的配置设置Key。

更多详情请参考Composite keys,ForeignKey Attribute,SO thread和this。

【讨论】:

以上是关于实体框架 SQL 和 SQLite 混淆:ModelValidationException的主要内容,如果未能解决你的问题,请参考以下文章

没有 App.config 的 SQLite 实体框架

实体框架 6 和 SQLite - 无法创建条目 PK 之前删除的条目

SQLite 是不是适用于实体框架?

将项目从 SQL 切换到 SQLite

text 实体框架核心和sqlite:数据库迁移(使用VS2017 macOS)

如何在 Visual Studio 2013 中为 sqlite 配置实体框架 6