C# 缺少列的实体框架核心默认值

C# 缺少列的实体框架核心默认值,c#,entity-framework-core,ef-core-2.2,C#,Entity Framework Core,Ef Core 2.2,我有一个sqlite数据库,它有一些表和列,如下所示: int Id text Name text Comment ... 我的项目中的对象如下所示: Public Class Entry { public int Id { get; set; } public String Name { get; set; } public String Comment { get; set; } public String Additional { get; set; }

我有一个sqlite数据库,它有一些表和列,如下所示:

int Id
text Name
text Comment
...
我的项目中的对象如下所示:

Public Class Entry {
    public int Id { get; set; }
    public String Name { get; set; }
    public String Comment { get; set; }
    public String Additional { get; set; }
}
这可能发生,因为我的程序需要处理不同版本的数据库。 EF Core现在尝试访问数据库的
附加
字段,但返回一个找不到该字段的错误。(预期行为)

现在我的问题是,是否有办法忽略此错误并返回属性的默认值

我可以通过使属性为空来绕过错误。但是我不想在访问每个属性之前使用
.HasValue()
检查它。因为实际数据库在表中有50多列。

将NotMapping作为附加字段的属性:

using System.ComponentModel.DataAnnotations.Schema;

Public Class Entry {
    public int Id { get; set; }
    public String Name { get; set; }
    public String Comment { get; set; }

    [NotMapped]
    public String Additional { get; set; }
}

这会告诉EF该字段不是数据库中的列。

我建议您将域对象从持久化的dto对象中拆分出来。这样,您就可以使用不同的映射拥有不同的DTO。现在,您可以使用dto实例化域对象,并在域对象内部决定哪些值是正确的默认值

public class Entry
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }
    public string Additional { get; set; }
}

public class EntryDtoV1
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }
}

public class EntryDtoV2
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }
    public string Additional { get; set; }
}

现在,您只需要创建某种工厂,根据查询的数据库版本创建正确的存储库。

取决于服务器和客户端之间的版本差异。服务器发送的列可能比客户端预期的少。在您的情况下,服务器是DB,客户端是您的应用程序吗?或者您指的是web服务器和浏览器客户端?例如,客户端是使用sqlite作为本地数据库的windows客户端。服务器创建此数据库并将其提供给客户端。因为客户端必须能够脱机工作。如果客户端得到更新,但服务器没有得到更新,则客户端可能希望数据库中的列不是服务器提供的。在这种情况下,我不希望出现异常,但希望获得默认值。如果数据库不包含模型上的字段,则必须将该字段标记为未映射。您可以考虑使用Entity Framework Fluent API来执行更复杂的逻辑。问题如下:客户端尝试访问sqlite数据库中可能不存在的列。我知道,如果服务器的版本比客户端的版本旧,就会发生这种情况。你在你的工厂里处理这件事。当然,您的工厂必须知道它使用的服务器版本。这样你就有了一个干净的设计。好的,谢谢。这当然适用于进一步的版本。但是对于旧版本,我们不得不面对特定版本组合中的一些错误。不客气:)我有一个类似的问题,首先使用了另一个解决方案。我使用的解决方案在开始时很好,但随着时间的推移变得更糟。第二种方法使用了类似于我在这里写的解决方案的东西,在知道它工作正常之前,也许将来也会改变;)