C # LINQ Query Hanging - PullRequest
       34

C # LINQ Query Hanging

0 голосов
/ 26 сентября 2019

Я работаю над созданием приложения ac # и частью приложения;Я пытаюсь внести .csv в таблицу данных;и затем в основном перебираю каждую строку и запрашиваю базу данных, чтобы увидеть, существуют ли данные.

Я тестирую запрос LINQ;но я не могу заставить его работать и отображать что-либо.У меня есть следующий код настройки для запуска ниже:

У меня есть добавленная база данных и тестирование соединения успешно;У меня есть настройки классов.Я прошел несколько курсов по множественному взгляду, чтобы проверить;и я не уверен, что именно я делаю неправильно или отсутствует.

Также как примечание;имя таблицы на самом деле ERP.PartTran, а не PartTran, но мне не удалось настроить это для контекста БД;Может быть, поэтому?

РЕДАКТИРОВАТЬ: Код добавлен;удалено изображений

public class EpiDB : DbContext
        {
            public DbSet<Tran> PartTran { get; set; }
        }

        public class Tran
        {
            public int TranNum { get; set; }
            public string TranReference { get; set; }
            public string PartNum { get; set; }

        }
        private static void QueryPartTran()
        {
            var db = new EpiDB();
            int tranref = 4650374; //lookup number
            var query = from Tran in db.PartTran
                        where Tran.TranNum == tranref
                        orderby Tran.TranNum
                        select Tran;

            foreach (var Tran in query)
            {
                Debug.Print(Tran.PartNum);
            }
        }

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Если у вас есть существующая схема базы данных, первым делом, чтобы избежать мягких исключений, является отключение создания / переноса схемы в EF.По умолчанию, когда EF подключается к базе данных и переходит к разрешению схемы, если он сталкивается с таблицей, которую не может разрешить, он создает ее.Ключ, который я вижу, может быть в этом случае, когда вы говорите, что таблица называется [ERP] .PartTran.Я подозреваю, что вы можете обнаружить, что в вашей базе данных есть новая пустая таблица с именем [dbo] .Tran.(при условии, что SQL Server)

Чтобы отключить создание схемы: В конструкторе контекста Db

public EpiDB()
{
   Database.SetInitializer<EpiDB>(null);
}

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

Сущности должны отображаться относительно близко, если не идентично вашей таблице.Переименование сущности или свойств, отличающихся от таблицы, для пояснения их в коде - это хорошо, но вы должны быть уверены, что при этом вы дадите EF достаточно информации о вашей схеме, чтобы она могла правильно разрешить таблицу.Если ваша таблица называется «PartTran», а ваш экземпляр DbSet называется «PartTran», почему вы хотите назвать сущность «Tran», а не «PartTran»?

Если схема вашего приложения - «ERP», тогдавы можете избежать необходимости указывать имя схемы для каждой сущности, добавив следующее к вашему DbContext.OnModelCreating ():

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.HasDefaultSchema("ERP");

    // ...
}

В противном случае, если вы используете несколько схем, вам необходимо явно отобразить схемудля использования с атрибутом [Table] или ToTable("{tableName}", "{SchemaName}") в конфигурации EntityTypeConfig / modelBuilder.

Далее убедитесь, что поля вашего объекта соответствуют соответствующим полям в таблице.Вам не нужно отображать каждое поле, если оно вам не нужно, но как минимум вам необходимо сопоставить Первичный ключ.По предположению сущности PartTran, я предполагаю, что вы либо пропускаете что-то вроде столбца PartTranId, либо PK представляет собой составной ключ, использующий столбцы PartNum и TranNum.Если у вас есть PartTranId или похожий PK, добавьте его к объекту вместе с атрибутом [Key].Если PK является составным:

    public class PartTran
    {
        [Key, Column(Order = 1)]
        public int TranNum { get; set; }
        public string TranReference { get; set; }
        [Key, Column(Order = 2)]
        public string PartNum { get; set; }
    }

Это должно дать вам несколько идей для сравнения с вашей кодовой базой ... Чтобы пойти дальше, это поможет изменить ваш вопрос, включив в него соответствующие таблицы и любые другие.сущности, которые вы пытались создать до сих пор.Что-то вроде «PartTran» выглядит как объединяющая таблица для отношения «многие ко многим» между таблицей «Part» и таблицей «Tran» (saction?).Если это так, есть несколько вариантов, как вы можете эффективно подключить это в EF, чтобы вывести данные так, как вы хотите.

0 голосов
/ 26 сентября 2019

Попробуйте это:

    public class EpiDB : DbContext
    {
        public DbSet<Tran> PartTran { get; set; }
    }

    [Table("PartTran", Schema = "ERP")]
    public class Tran
    {
        public int TranNum { get; set; }
        public string TranReference { get; set; }
        public string PartNum { get; set; }
    }

И, может быть, даже:

    public class EpiDB : DbContext
    {
        public DbSet<Tran> PartTran { get; set; }
    }

    [Table("PartTran", Schema = "ERP")]
    public class Tran
    {
        [Key] // Is this your primary key field?
        public int TranNum { get; set; }
        public string TranReference { get; set; }
        public string PartNum { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...