У меня есть проект Xamarin Forms и проект MVC Core с общей библиотекой классов, которая содержит AppDbContext и мои репозитории. При работе на MVC все мои методы Get работают нормально, но на Xamarin Forms iOS я получаю следующую ошибку:
{System.TypeInitializationException: инициализатор типа для Microsoft.Data.SqlClient .TdsParser 'выбросил исключение. ---> System.TypeInitializationException: инициализатор типа для «Microsoft.Data.SqlClient.SNILoadHandle» вызвал исключение. ---> System.DllNotFoundException: сборка sni.dll: тип: member: (null)
Строка, в которой код завершается ошибкой, является последней строкой ниже (в моем OnAppearing):
string connectionString = "user id=test; data source=test.internal.com,3002;initial catalog=testDB;password=test";
AppDbContext context = new AppDbContext(new DbContextOptionsBuilder<AppDbContext>().UseSqlServer(connectionString).Options);
PersonRepository repo = new PersonRepository(context);
var results = await repo.GetAll();
Ранее я использовал Dependency Injection, но я использую вышеупомянутое, чтобы найти проблему. Мой метод GetAll PersonRepository выглядит следующим образом:
public async Task<IEnumerable<Person>> GetAll()
{
return await context.Person.ToListAsync<Person>();
}
А мой AppDBContext выглядит следующим образом:
public class AppDbContext :DbContext
{
public DbSet<Person> Person { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
foreach (var foreignKey in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
foreignKey.DeleteBehavior = DeleteBehavior.NoAction;
}
}
}
Как я уже говорил, этот код работает на MVC, но не на Xamrin iOS. Я использую самые современные нюгеты:
- EFCore 3.1.2
- EFCore.SQLServer 3.1.2
- Общая библиотека классов .NetStandard 2.1
- Xamarin.Forms 4.5.0.356
Я просмотрел другие посты, но не смог найти ничего, касающегося Xamarin или iOS. Я попытался установить Microsoft.Data.SQLClient и Microsoft.Data.SQLClient.sni в общую папку, но это не помогло решить проблему.
Примечание:
- Xamarin iOS установлен на No Linking
- Работает на iOS симуляторе (сейчас не могу попробовать физическое устройство)