Zumero Sqlite Sql Класс данных сервера неверное приведение - PullRequest
0 голосов
/ 05 февраля 2020

Моя команда и я создаем мобильное приложение в Xamarin Forms, чтобы позволить нашим клиентам иметь элементарный доступ к своим данным через мобильный телефон. Мы используем zumero для создания локальной sqlite-копии базы данных сервера ms sql. Чтобы заставить Entity Framework Core работать на устройстве, я создал модели и контекст путем обратного инжиниринга из файла sqlite, через который синхронизировался zumero.

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");
        //...

Для следующего этапа разработки я добавил проект WinForms в решение Visual Studio и попытался создать действительно простое приложение, аналогичное функциональности мобильного приложения, и Я хотел иметь возможность повторно использовать модель данных, если это возможно.

Сначала я ошибочно подумал, что могу просто переопределить одну строку кода:

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 синхронизировал информацию, он создал столбец типа text в файле SQLite. Я попытался использовать модель данных, которую я обратно разработал, непосредственно с сервера SQL, и использовать ее для создания файла SQLite, а тип столбца был datetime.

Я также пытался использовать protected override void OnModelCreating(ModelBuilder modelBuilder) от SQL сервера обратного инженера, и это выдало следующее сообщение об ошибке: "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 знает способ, которым я могу создать модель со свойством типа DateTime в C#, хотя Zumero создает столбец SQLite типа text, возможно, это было бы возможным решением. дорожка? В любом случае, я бы хотел найти способ использовать одну и ту же модель данных для обоих проектов, если это возможно.

Есть ли способ организовать Zumero, Sql Server и / или мою модель данных так, чтобы они могли работать вместе?

Как программист-самоучка, я действительно новичок ко всему этому, так что любая помощь очень ценится! Спасибо !!

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Кажется, это больше похоже на Entity Framework, чем на Zumero. Вы пытаетесь использовать один и тот же контекст базы данных для подключения к SQL Server и SQLite? Так как это довольно большая проблема, и она потребует туда-сюда, я рекомендую отправить по электронной почте support@zumero.com.

0 голосов
/ 06 февраля 2020

Джереми Шили просмотрел мой код, обсудил вопрос со мной и показал мне возможное решение. Он был очень вежлив, когда просматривал код кодера-самоучки. : -)

Вопрос, который задают, является задом наперед правильного ответа, если я правильно понимаю ответ. Джереми поделился со мной примером кода, чтобы помочь мне понять, как создать код, который будет отображаться из моделей, которые были обратно разработаны с сервера SQL, и позволить EF правильно использовать их с источником данных SQLite. Итак, я пытался извлечь go из моих моделей, которые были сконструированы из источника данных 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());
                }
            }
        }
    }
}

Огромное спасибо Джереми за помощь в этом !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...