Zumero Sqlite Sql 服务器数据 Class 无效转换

Zumero Sqlite Sql Server Data Class Invalid Cast

我和我的团队正在 Xamarin Forms 中构建一个移动应用程序,以允许我们的客户通过移动设备对他们的数据进行一些基本的访问。我们正在使用 zumero 处理创建 ms sql 服务器数据库的本地 sqlite 副本。为了让 Entity Framework Core 在设备上运行,我通过对 zumero 同步的 sqlite 文件进行逆向工程来创建模型和上下文。

public partial class tblEmployeeSchedule : BaseModel, ICrewMember
{
    //...
    public string DtDate { get; set; }
public class EFDatabase : IDataStore
{
    public DataContext Context { get; set; }
    public EFDatabase(string filepath)
    {
        try
        {
            this.Context = new DataContext(filepath);
public partial class DataContext : DbContext
{
    public string ConnString { get; private set; }

    public DataContext(string filepath)
    {
        this.ConnString = filepath;
    }

    //...
    public virtual DbSet<tblEmployeeSchedule> tblEmployeeSchedule { get; set; }
    //...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //...
        modelBuilder.Entity<tblEmployeeSchedule>(entity =>
        {
            entity.HasKey(e => e.Oid);

            entity.Property(e => e.DtDate).HasColumnName("dt_date");
        //...

为了下一阶段的开发,我向 Visual Studio 解决方案添加了一个 WinForms 项目,并尝试创建一个非常简单的应用程序,它具有与移动应用程序类似的功能,我希望能够重用数据模型(如果可能)。

起初,我误以为我可以简单地重写一行代码:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseSqlite($"Data Source={ConnString}");

将其替换为:

protected override void OnConfiguring(DbContextOptionsBuilder options)
    => options.UseSqlServer(ConnString);
var connString = $"Server={server}; Database={db}; User Id={username}; Password={password};";
Program.Database = new SqlServerDatabase(connString);

但是当我尝试 运行 程序时,它抛出了以下错误:

InvalidCastException
Message: "Specified cast is not valid."
Source: "Microsoft.Data.SqlClient"

我猜错误是由于数据模型不匹配造成的。当 Zumero 同步信息时,它在 SQLite 文件中创建了一个 text 类型的列。我尝试使用直接从 SQL 服务器逆向工程的数据模型,并使用它创建一个 SQLite 文件,列类型是 datetime

我还尝试使用 SQL 服务器逆向工程师的 protected override void OnModelCreating(ModelBuilder modelBuilder),并给出了以下错误消息:"The property 'tblCrewSchedule.DtDate' is of type 'string' which is not supported by current database provider. Either change the property CLR type or ignore the property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'."

我一直在想办法构建一个双方都可以使用的代码优先数据模型,但我想不出解决方案。我想也许如果 Zumero 知道我可以创建一个模型,在 C# 中 属性 是 DateTime 类型,即使 Zumero 正在创建 SQLite 类型的列 text,也许这是一个可能的解决方案?无论如何,如果可能的话,我想找到一种能够为两个项目使用相同数据模型的方法。

有什么办法可以安排 Zumero、Sql 服务器、and/or 我的数据模型,以便它们可以协同工作?

作为一个自学成才的程序员,我对这一切真的很陌生,所以非常感谢任何帮助!谢谢!!

这似乎更像是与 Entity Framework 有关,而不是与 Zumero 有关。您是否尝试使用相同的数据库上下文连接到 SQL 服务器和 SQLite?由于这是一个相当大的问题,并且需要来回,我建议发送电子邮件给支持@zumero.com。

Jeremy Sheeley 查看了我的代码,与我讨论了这个问题,并向我展示了一个可能的解决方案。他很有礼貌地看着一个自学成才的编码员的代码。 :-)

如果我理解正确的话,所问的问题是正确答案的倒退。 Jeremy 与我分享了一个代码示例,以帮助我了解如何构建将从 SQL 服务器反向工程的模型映射的代码,并允许 EF 将它们正确地用于 SQLite 数据源.因此,我试图从根据 SQLite 数据源设计的模型出发,但我需要反转它,然后在数据上下文中应用值转换。

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
//...

public partial class SQLiteEFDatabase : EFDatabase
{
   //...
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        ConfigureValueConversions(modelBuilder);
    }

    //...

    private void ConfigureValueConversions(ModelBuilder modelBuilder)
    {
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            foreach (var property in entityType.GetProperties())
            {
                if (property.ClrType == typeof(Guid))
                {
                    property.SetValueConverter(new GuidToBytesConverter());
                }
            }

            foreach (var property in entityType.GetProperties())
            {
                if (property.ClrType == typeof(DateTime))
                {
                    property.SetValueConverter(new DateTimeToStringConverter());
                }
            }
        }
    }
}

非常感谢 Jeremy 的帮助!!!