Вопросы с тегами [entity-framework-core]

0

голосов
0

ответ
6

Просмотры

Linq, EF Ядро - группы на одном поле и использовать другое поле, чтобы получить список данных из другой таблицы

Кто-нибудь может мне помочь. Я попробовал все, ничего не получалось. У меня есть данные в этом формате table1 Id T_Id 4 2 6 5 6 7 table2 T_Id Fname LNAME 2 мэри кузнец 5 Джон Поуп 7 стив Блер Я хочу, чтобы получить данные в следующем формате, используя Linq запрос с EF Core. [{ "Идентификатор": "4", "пользователи": [{ "T_Id": 2, "имя_файла": "мэри", "LNAME": "Смит"}]}, { "Идентификатор": "6", "пользователи": [{ "T_Id": 5, "имя_файла": "Джон", "LNAME": "папа"}, { "T_Id": 7, "имя_файла": "стив", "LNAME": «Blair "}]}]
Shamal
1

голосов
2

ответ
1.6k

Просмотры

Do I use Snapshot file, migration file or data annotations in my EF Core to update database?

Я пытаюсь понять различные типы путей миграции можно выбрать при разработке 1.0 приложения ASP.NET ядро ​​с EF Core. Когда я создал свое первое приложение Core, я заметил, что создается класс ApplicationDbContextModelSnapshot, который использует ModelBuilder для построения модели. Потом я прочитал, что если мне нужно добавить таблицу в базу данных, мне нужно, чтобы создать новую модель и запустить командную строку для создания файла миграции и обновления базы данных. Хорошо, я его до этого момента. Но когда я делаю это, я заметил, что класс ApplicationDbContextModelSnapshot обновляется тоже. 1) Означает ли это, что я не могу изменить этот класс ApplicationDbContextModelSnapshot, так как он выглядит, как он получает регенерируется каждый раз? 2) Должен ли я использовать аннотации данных, чтобы построить свою модель или я должен использовать Fluent API, который говорит мне построить свою модель в классе ApplicationDbContext? А? другой файл, который строит модель? Я вижу три различных способа работы с базой данных здесь, класс снимка, аннотации данных, а также свободно API. Я запутался, потому что сегодня, я сделал ошибку в моем последней миграции файл, так что я удалил файл, отбросил базу данных и перезапустил обновление базы данных. Но, делая это, я получил ошибки, похожие на: Индекс «IX_Transaction_GiftCardId» зависит от столбца «GiftCardId». ALTER TABLE ALTER COLUMN GiftCardId не удалась, так как один или несколько объектов, доступ к этому колонку. Поэтому, естественно, мне было интересно, если я должен был изменить класс ApplicationDbContextModelSnapshot. Какой путь я должен принимать, когда речь идет о миграции или обновление базы данных, потому что эти три пути путают меня.
Ray
1

голосов
2

ответ
37

Просмотры

Запись отношение один к одному, используя Fluent API

Как написать один-к-одному - отношения или нул с использованием свободно апи? Может кто-то помочь мне исправить то, что я написал. Я не уверен, если его правильно. Сценарий: Один студент может иметь один или нулевой адрес. Студент модели общественного ИНТ Id {получить; задавать; } Публичная строка Name {получить; задавать; } Общественности Адрес Адрес {получить; задавать; } Адрес модели общественного Int Id {получить; задавать; } Публичная строка Street {получить; задавать; } Общественного ИНТ StudentId {получить; задавать; } Общественности Студент {получить; задавать; } То, что я пробовал: builder.HasOne (и => u.Address) .WithOne (б => b.Student) .HasForeignKey (б => b.StudentId);
Illep
1

голосов
1

ответ
2.1k

Просмотры

Change tracking in Entity Framework Core 2.0 changed my code behavior

Этот код работает отлично в Entity Framework 1.0 также может быть 1.1. вар pupilFound = ждут context.Pupils.SingleOrDefaultAsync (р => p.Id == pupil.Id); если (pupilFound == NULL) {певд BadDataException ($ "{nameof (pupil.Id)} не является действительным"); } Если (! PupilFound.UserId = идентификатор пользователя) {певд NotAuthorizedException (); } Pupil.UserId = идентификатор пользователя; context.Entry (ученик) .State = EntityState.Modified; ждут contextSaveChangesAsync (); Теперь с Entity Framework Ядра 2.0 Я получил это исключение с ошибкой: Не может быть отслежены, так как другой экземпляр этого типа с тем же ключом уже отслеживаются Быстрое исправление будет: вар pupilFound = ждут context.Pupils.AsNoTracking.SingleOrDefaultAsync (р = > p.Id == pupil.Id); Таким образом, отслеживание отключено, но что поражения цели методы AsNoTracking относительно официальной рекомендации: https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.changetracking.changetracker.querytrackingbehavior?view=efcore-2.0 Отключения отслеживания изменений полезно только для чтения сценариев, поскольку это позволяет избежать // накладных настройки отслеживания изменений для каждого экземпляра объекта. Вы должны // не отключить отслеживание изменений, если вы хотите управлять экземплярами объектов и сохраняются // этих изменений в базу данных с помощью Microsoft.EntityFrameworkCore.DbContext.SaveChanges Как еще обновят ученик со всеми его свойствами приходят от клиента? 0 Отключение отслеживания изменений полезно только для чтения сценариев, поскольку это позволяет избежать // накладных настройки отслеживания изменений для каждого экземпляра объекта. Вы должны // не отключить отслеживание изменений, если вы хотите управлять экземплярами объектов и сохраняются // этих изменений в базу данных с помощью Microsoft.EntityFrameworkCore.DbContext.SaveChanges Как еще обновят ученик со всеми его свойствами приходят от клиента? 0 Отключение отслеживания изменений полезно только для чтения сценариев, поскольку это позволяет избежать // накладных настройки отслеживания изменений для каждого экземпляра объекта. Вы должны // не отключить отслеживание изменений, если вы хотите управлять экземплярами объектов и сохраняются // этих изменений в базу данных с помощью Microsoft.EntityFrameworkCore.DbContext.SaveChanges Как еще обновят ученик со всеми его свойствами приходят от клиента?
HelloWorld
1

голосов
0

ответ
67

Просмотры

разрешения Refresh пользователя после удалены из роли

У меня есть проект, где я могу назначить пользователям роли. Моя проблема заключается в том, что при удалении пользователя из роли, пользователь сможет получить доступ к ресурсам, которые он не loger должен видеть. Единственный способ, чтобы обновить его разрешения, когда он выйти и снова войти в систему. Это проблема, потому что, когда я хочу, чтобы остановить пользователь от доступа к конфиденциальным данным, я не могу это сделать, потому что рамки кэшировать его разрешение. Разрешения не будут обновляться, даже если перезапустить приложение. Есть ли способ, чтобы очистить пользователь кэшированных разрешения, когда я удалить его из роли или когда я добавляю его в ролях?
pitaridis
0

голосов
1

ответ
2

Просмотры

System.AccessViolationException или System.ExecutionEngineException аварии в SQLitePCLRaw.provider.e_sqlite3.dll с множественным доступом резьбой

EDIT: (разрешаемые номер 6) Что вызывает System.AccessViolationException или System.ExecutionEngineException сбой в SQLitePCLRaw.provider.e_sqlite3.dll, когда несколько потоков получить доступ к моей FooDbContext одновременно? У меня есть Xamarin Forms приложение (3.5.0.169047) с поддержкой UWP, Android и IOS, используя NETstandard 2.0.3, 2.2.4, Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Sqlite 2.2.4, и у меня есть ситуации, воспроизводимые аварии (это происходит точно на UWP), что я есть проблема, которая возникает разрешающую при одновременном доступе к базе данных SQLite на устройстве из двух разных потоков одновременно. У меня есть процесс синхронизации (выталкивает локальные данные к API и тянет онлайн данные из API), который может занять до минуты или около того, что мне нужно выполнить в отдельном потоке, чтобы сохранить пользовательский интерфейс отзывчивый во время его работы. Мне также нужно разрешить обработку запросов локальных данных во время синхронизации, чтобы позволить навигацию во время синхронизации или других операций только для чтения данных в пределах приложения во время синхронизации. Затянувшаяся синхронизация работает нормально, если я не делать какие-либо операции доступа к данным во время синхронизации, но вылетает сразу после завершения любой отключающей операции доступа к данным короче. Два исключения аварии, которые я видел произойти (возможно, временные, связанные, для которых приводит к аварии на идентичных репродукций) являются, как видно из вывода отладки из Visual Studio 2017 (v15.9.5): необработанное исключение типа «System .AccessViolationException»произошло в SQLitePCLRaw.provider.e_sqlite3.dll Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. Необработанное исключение типа «System.ExecutionEngineException» произошло в SQLitePCLRaw.provider.e_sqlite3.dll При отладке, не существует каких-либо дополнительных подробностей о исключения; это происходит во время различных долгоиграющих строк коды синхронизации, в зависимости от времени делать прерывающее действие; и продолжительном код, где отладчик показывает исключение происходит это все содержится в Try {...} Поймать (Exception) {...} попробуйте блок в моем коде. Что может быть причиной этого и как я могу решить это? Я прошел через все следующие: Является ли использование SQLite совместим с несколькими потоками? Да; он находится в режиме «сериализованном» по умолчанию в соответствии с https://www.sqlite.org/threadsafe.html и что поддерживает использование многопоточного без ограничений. Основная версия SQLite используется в 3.26.0, который я определил, исследуя мой Microsoft.Data.Sqlite. Информация SQLiteConnection при отладке. Это потому, что я не могу иметь более чем одно соединение открытого с возможностью записи одновременно? Нет; Я даже модифицирована мои строки подключения с помощью Microsoft.Data.Sqlite.SqliteConnectionStringBuilder иметь соответствующий режим (SqliteOpenMode.ReadOnly или SqliteOpenMode.ReadWriteCreate), в зависимости от потребностей каждого доступа к данным. Является ли это потому, что Dispose прерывающего потока FooDbContext (в) избавляется от ресурсов, которые FooDbContext продолжительной нити, на которые ссылаются? Нет; Я исследовал это много, так как это был последний точки останова, я мог ударить до аварии. Даже когда я перегрузил Dispose метода в FooDbContext не делать ничего, даже не называть Dispose базового класса (не рекомендуется, но я попробовал это временно), авария произошла еще. Есть ли настройки можно установить с помощью Microsoft.Data.Sqlite.SqliteConnectionStringBuilder или Microsoft.Data.Sqlite.SQLiteConnection или функцию UseSqlite Microsoft.EntityFrameworkCore.DbContextOptionsBuilder, чтобы гарантировать, что Сериализированная режим используется (я не был 100% уверен, что это было в этом точка)? Нет; Я посмотрел широко, и этот вариант должен быть спрятан в внутренностях SQLite библиотеки выбрала. Я сделал изрядное количество чтения и исследования, которые до сих пор дали мне немного еще я мог бы попробовать. https://www.sqlite.org/sharedcache.html https://www.sqlite.org/lockingv3.html https://www.sqlite.org/atomiccommit.html#sect_9_0 https://www.sqlite.org /uri.html https://docs.microsoft.com/en-us/ef/core/get-started/uwp/getting-started https://docs.microsoft.com/en-us/ef/core/get -started / Netcore / новый-DB-SQLite https: // GitHub. ком / САШ / EntityFrameworkCore / вопросы / 5466 https://docs.microsoft.com/en-us/windows/uwp/data-access/sqlite-databases https://www.connectionstrings.com/sqlite/ https: // csharp.hotexamples.com/examples/-/DbContextOptionsBuilder/UseSqlite/php-dbcontextoptionsbuilder-usesqlite-method-examples.html https://system.data.sqlite.org/index.html/info/dd30ecb89d423c4c https: // WWW. sqlite.org/src/info/e8d439c77685eca6 https://forums.asp.net/t/2143077.aspx?EntityFramework+Core+Do+we+have+to+explicitly+dispose+the+DBContext https: // GitHub. ком / САШИ / EntityFrameworkCore / вопросы / 9901 https://xamarinhelp.com/entity-framework-core-xamarin-forms/ EDIT: Ответ, который решил эту проблему для меня: я заметил, что дллы исключение пришло были SQLitePCLRaw.provider .e_sqlite3.dll. Это привело меня к глядя на то, что на самом деле создает библиотеку SQLite низкого уровня, и это в конечном счете, вызов SQLitePCL.Batteries_V2.Init (); который выбирает для конкретной платформы поставщика SQLite низкого уровня, который будет использоваться. Может ли это быть так? Да; получается, что после прочтения через информацию вики на https://github.com/ericsink/SQLitePCL.raw/wiki/SQLitePCL.Batteries.Init#what-does-batteries_v2init-do, что вызов был SQLitePCL.Batteries_V2.Init предназначено быть сделано только один раз для каждой платформы (либо платформы конкретного кода, или в общем коде, пока установлено Microsoft.EntityFrameworkCore.Sqlite в общем проекте, а также каждую платформу конкретного проекте). Мое использование SQLitePCL.Batteries.Init было неправильно внутри OnConfiguring в FooDbContext, который сделал это называется один раз в настройке из FooDbContext вместо только делается один раз в запуске приложения. Перемещение SQLitePCL.Batteries_V2.Init (); линия из OnConfiguring, и в конструктор App.xaml.cs в моем общем проекте установил ее! не Аварии больше не произошло после того, как доступ к данным прерывающих потока. Я действительно надеюсь, что это спасает кого-то огромные нервотрепки он спас меня, пытаясь добраться до нижней частью этого.
Tommy Elliott
1

голосов
0

ответ
44

Просмотры

Entity Framework - вставить данные с «равными» (но не ReferenceEqual) Эталонные свойствами

Я использую EFCore. У меня есть несколько объектов (лицо), которые содержат определенные навигационные свойства (Skill). Человек-объекты Я имеющие были созданы таким образом, что некоторые могут иметь навыки, которые имеют одни и те же ключи, однако они имеют разные объекты, т.е. имеют разные ссылки. Предположим, я не имею никакого влияния на пути их создания. Когда я пытаюсь вставить их с помощью EFCore, я столкнулся исключение, потому что EFCore не может отслеживать несколько Skill объектов с одинаковыми ключами: Класс Skill: IEquatable {строка Name {получить, установить;} BOOL Equals (Skill другой) {. ..} переопределение BOOL Равно (объект другой) {...} переопределение INT GetHashCode () {...}} класс Person {строка Name {получить, установить;} умение умение {получить, установить;}} вар skill1 = новый умение {Name = "тест умение"}; вар person1 = новый Person {Name = "Person2", Skill = skill1}; вар skill2 = новый навык {Name = "тест умение"}; вар PERSON2 = новый Person {Name = "Person2", Skill = skill2}; вар люди = новый [] {person1, PERSON2}; // skill1.Equals (skill2), но это все равно будет сгенерировано исключение, потому что EF не может отслеживать два умение объекты с тем же ключом Context.People.AddRange (человек); В «принципе», не должна быть никакой проблемы вставки этого в БД - Навык объекты имеют один и тот же ключ, но также равны, так что бы просто нужно быть 1 ВСТАВИТЬ в базу данных. Конечно, это не идет хорошо, как EF обрабатывает вещи, и как осуществляется отслеживание изменений. Единственный способ, которым я могу думать, после того, как Человек-объекты создаются (имейте в виду, предположение, я не могу контролировать это), чтобы вручную перебрать все объекты Person, я хочу вставить, и «объединить» все свойства навигации. Или, другими словами, заменить все объекты Skill, которые равны (Skill.Equals) с одной и той же ссылке - или какой-либо взяты из объектов, которые будут добавлены, или один извлечена из базы данных, в случае, если он уже содержит запись с Нужный key.y Хотя это будет работать в таком простом случае, это становится очень сложным в моем реальном прецеденте, который имеет гораздо больше эталонных свойства, которые имеют свои собственные свойства refereence и так далее. Есть ли более стандартный / более эффективный способ обработки этой проблемы? Спасибо это становится очень сложными в моем реальном прецеденте, который имеет гораздо больше эталонных свойства, которые имеют свои собственные свойства refereence и так далее. Есть ли более стандартный / более эффективный способ обработки этой проблемы? Спасибо это становится очень сложными в моем реальном прецеденте, который имеет гораздо больше эталонных свойства, которые имеют свои собственные свойства refereence и так далее. Есть ли более стандартный / более эффективный способ обработки этой проблемы? Спасибо
Bogey
1

голосов
0

ответ
122

Просмотры

Entity Framework Group Join on a Many To Many Relationship

I have a Campaign Table and a Group table with a many to many relationship. I also have a CampaignGroup table which serves the xref table between the two. I want to do a group join from Campaign to Group so that I end up with an object that looks like: public Campaign Campaign {get;set;} public List Groups {get;set;} Due to reasons beyond my control, I cannot use Entity Framework's Include feature. If I can do a Group Join from Campaign to CampaignGroup like this: _dbContext.Campaigns.GroupJoin(_dbContext.CampginGroup, c => c.CampaignId, cg => cg.CampaignId, (c, cg) => new { Campaign = c, CampaignGroups = cg } But that gives me an object that looks like: public Campaign Campaign {get;set;} public List CampaignGroups {get;set;} How do I take this GroupJoin to the next level and get just the group? I tried this, but when it executes Entity Framework warns me that it can't be evaluated and will be performed locally which kills the performance: var campaignGroupQuery = _dbContext.CampaignGroup.Join( _dbContext.Group, cg=> cg.GroupId, g=> g.GroupId, (cg, g) => new { CampaignId = cg.CampaignId, Group= g }); return _dbContext.Campaigns.GroupJoin(campaignGroupQuery, campaign => campaign.JlmReferenceId, cg=> cg.JlmReferenceId, (campaign, cg) => new { Campaign = campaign, Groups = cg.Select(cg => cg.Group) }); Any help would be appreciated. Thanks!
jkruer01
1

голосов
1

ответ
109

Просмотры

Как избежать Entity Базовых рамок OrderBy свойства списка от делать Top (1) для каждого списка элемента в базе данных?

Я сделать запрос к базе данных с помощью EF Ядро 2.0.1 и, в частности, в NuGet пакет Microsoft.EntityFrameworkCore.SqlServer 2.0.1. Вот мои модели: открытый класс Foo {общественности Foo () {Id = Guid.NewGuid (); } Общественного Guid Id {получить; защищенный набор; } Общественного IEnumerable Bars {получить; задавать; }} Класс Бар общественных {общественный бар (строковое значение, Guid anotherId) {Id = Guid.NewGuid (); Значение = значение; AnotherId = anotherId; } Защищенный Bar () {} общественного Guid Id {получить; защищенный набор; } Общественного Guid AnotherId {получить; защищенный набор; } Публичная строка Значение {получить; защищенный набор; }} Создать 10 Foo экземпляров, которые имеют список штриховых экземпляров 2 каждый и сохранить, что в базу данных. Когда я пытаюсь и порядок свойством Bar.Value где AnotherId равно anotherId2, это делает в общей сложности 30 вызовов в базе данных. Вот мои настройки и запрос на заказ по свойству значения на экземпляре бара, где он имеет anotherId2: Guid anotherId1 = Guid.NewGuid (); Guid anotherId2 = Guid.NewGuid (); используя (DbContext DbContext = GetDbContext ()) {dbContext.Add (новый Foo {Bars = новый [] {нового бара ( "А", anotherId1), новый бар ( "Z", anotherId2)}}); dbContext.Add (новый Foo {Барс = новый [] {новый бар ( "б", anotherId1), новый бар ( "у", anotherId2)}}); dbContext.Add (новые Foo {Барс = новый [] {новый бар ( "с", anotherId1), новый бар ( "х", anotherId2)}}); dbContext.Add (новый Foo {Барс = новый [] {нового бар ( "d", anotherId1), новый бар ( "V", anotherId2)}}); dbContext.Add (новый Foo {Барс = новый [] {нового бар ( "е", anotherId1), новый бар ( "ш", anotherId2)}}); DbContext. Добавить (новый Foo {Bars = новый [] {новый бар ( "F", anotherId1), новый бар ( "U", anotherId2)}}); dbContext.Add (новый Foo {Барса = новый [] {нового бар ( "г", anotherId1), новый бар ( "Т", anotherId2)}}); dbContext.Add (новый Foo {Барс = новый [] {нового бар ( "ч", anotherId1), новый бар ( "s", anotherId2)}}); dbContext.Add (новые Foo {Барс = новый [] {новый бар ( "я", anotherId1), новый бар ( "г", anotherId2)}}); dbContext.Add (новый Foo {Барс = новый [] {нового бар ( "J", anotherId1), новый бар ( "д", anotherId2)}}); dbContext.SaveChanges (); } Используя (DbContext DbContext = GetDbContext ()) {// К этому моменту, только 7 вызовов внесены в список базы данных FOOS = ждут dbContext.Set (). Include (х => x.Bars) .OrderBy (х => x.Bars.First (у => y.AnotherId == anotherId2) .Value). ToListAsync (); Assert.That (foos.First () Bars.Any (х => x.Value == "Q"), Is.True.); } Когда я использую SQL Profiler это показывает 30 SQL запросов к базе данных! Есть 20 вызовов, которые выглядят как ниже запрос, по одному для каждого перечисления anotherId2 и экземпляра бара:. Exec sp_executesql N'SELECT TOP (1) [y0] [Value] FROM [бар] AS [y0] WHERE ([y0 ]. [AnotherId] = @__ anotherId2_0) И (@_outer_Id = [у0]. [FooId])», N '@__ anotherId2_0 UniqueIdentifier, @ _ ​​outer_Id UniqueIdentifier', @ __ anotherId2_0 = '0AC1FBCA-6DEF-4F50-B4AA-CEC7286135B8', @ _outer_Id = «A6A1785A-B313-4EE7-A0B6-307F54D6F74A» Как я могу остановить это делает эти 20 звонков в базу данных, но все еще заказать Foo путем значения в случае anotherId2? } Когда я использую SQL Profiler это показывает 30 SQL запросов к базе данных! Есть 20 вызовов, которые выглядят как ниже запрос, по одному для каждого перечисления anotherId2 и экземпляра бара:. Exec sp_executesql N'SELECT TOP (1) [y0] [Value] FROM [бар] AS [y0] WHERE ([y0 ]. [AnotherId] = @__ anotherId2_0) И (@_outer_Id = [у0]. [FooId])», N '@__ anotherId2_0 UniqueIdentifier, @ _ ​​outer_Id UniqueIdentifier', @ __ anotherId2_0 = '0AC1FBCA-6DEF-4F50-B4AA-CEC7286135B8', @ _outer_Id = «A6A1785A-B313-4EE7-A0B6-307F54D6F74A» Как я могу остановить это делает эти 20 звонков в базу данных, но все еще заказать Foo путем значения в случае anotherId2? } Когда я использую SQL Profiler это показывает 30 SQL запросов к базе данных! Есть 20 вызовов, которые выглядят как ниже запрос, по одному для каждого перечисления anotherId2 и экземпляра бара:. Exec sp_executesql N'SELECT TOP (1) [y0] [Value] FROM [бар] AS [y0] WHERE ([y0 ]. [AnotherId] = @__ anotherId2_0) И (@_outer_Id = [у0]. [FooId])», N '@__ anotherId2_0 UniqueIdentifier, @ _ ​​outer_Id UniqueIdentifier', @ __ anotherId2_0 = '0AC1FBCA-6DEF-4F50-B4AA-CEC7286135B8', @ _outer_Id = «A6A1785A-B313-4EE7-A0B6-307F54D6F74A» Как я могу остановить это делает эти 20 звонков в базу данных, но все еще заказать Foo путем значения в случае anotherId2?
chris31389
1

голосов
1

ответ
157

Просмотры

Entity Framework Core Mapping Multiple objects to an object in one to many

Я пытаюсь работать, лучший способ справиться с объекта Note, который связан с несколькими объектами, то есть контакты, цитаты. Эти объекты могут иметь много Notes, котировка много Notes. общественный класс Примечание {общественный ИНТ Id {получить; задавать; } Публичная строка Title {получить; задавать; } публичная строка NoteDetails {получить; задавать; } Общественного DateTime CreatedDate {получить; задавать; } Общественного ИНТ? ContactId {получить; задавать; } Общественного ИНТ? QuoteId {получить; задавать; } Общественности Контакт NoteContact {получить; задавать; } Общественного Quote NoteQuote {получить; задавать; }} Общественного класса Contact {общественного ИНТ Id {получить; задавать; } Публичная строка Name {получить; задавать; } Публичная строка адреса {получить; задавать; } Общественного ICollection Примечание {получить; задавать; }} Общественного класса {Quote общественного ИНТ Id {получить; задавать; } Публичная строка Title {получить; задавать; } Публичная строка Описание {получить; задавать; } Общественного ICollection Примечание {получить; задавать; }} Это просто случай добавления внешних ключей в примечаниях к контактам, цитаты и т.д.? Затем виртуальные коллекции Notes в контакте, цитата и счета-фактуры объекта? Я надеюсь, что имеет смысл в том, что я пытаюсь достичь. Спасибо
Gweilo
1

голосов
1

ответ
76

Просмотры

EF Ядро команды Update-Database создает схему для пользователя вместо того, чтобы использовать DBO

Я создал DbContext с помощью EF Сердечник 2.0 и уже применяется много миграции в среде разработки с использованием Update-Database в PM-Console. Таблицы создаются с помощью dboschema на моем LocalDB, как и ожидалось, и я знаю от EF6. Однако, когда я применить команду Update-Database для моих производственной базы данных на MSSQL Server, он создает схему с именем домен \ Имя пользователя (мой пользователем из моей машины). Когда я затем запустить серверное приложение с назначенным учетной записью домена, он не может получить доступ к базе данных. В качестве обходного пути я говорил парням ИТ-инфраструктуры в эту учетную запись позволяет выполнить программное обеспечение на своем компьютере и применил migritions, выполнив VisualStudio с этой учетной записью. Тогда схема для этого специального счета создается и после этого он может получить доступ к базе данных сюда приложение веб-сервера. Он работает с этим специальным счетом в настоящее время только один, который необходим прямой доступ к базе данных (кроме себя). Но это должно пе быть постоянным решением. Кто-нибудь знает решение для этого? База данных была создана в точно таким же образом, как и для предыдущих проектов Ef6. Почему для каждого пользователя схемы используются только при применении миграции в систему производства, а не на моей машине развития, и как я могу контролировать схемы вручную? Я попытался modelBuilder.HasDefaultSchema ( "ДБО"); но это не работает. На самом деле, кажется, не имея никакого эффекта. Почему для каждого пользователя схемы используются только при применении миграции в систему производства, а не на моей машине развития, и как я могу контролировать схемы вручную? Я попытался modelBuilder.HasDefaultSchema ( "ДБО"); но это не работает. На самом деле, кажется, не имея никакого эффекта. Почему для каждого пользователя схемы используются только при применении миграции в систему производства, а не на моей машине развития, и как я могу контролировать схемы вручную? Я попытался modelBuilder.HasDefaultSchema ( "ДБО"); но это не работает. На самом деле, кажется, не имея никакого эффекта.
Buchter
1

голосов
0

ответ
410

Просмотры

Обновление связанных записей в EF ядре 2.0

Я пытаюсь обновить запись, и это связанных с ним предприятий, но я изо всех сил, чтобы найти способ, что он будет работать. У меня есть объект, который хранится информация о школьных губернаторов и их этнического происхождения. Этническое происхождение объект является простым поиском в таблице. Когда я пытаюсь обновить запись без ничего конкретного он не обновляет этническое происхождение, или если я специально старается обновлять это не удается с этим сообщением об ошибке ... «Свойство„Id“от типа объекта„EthnicOrigin“является частью ключ и поэтому не может быть изменен или помечен как изменённые. Для того, чтобы изменить основные существующий объект с идентификационным внешним ключом удалите зависимые и вызвать «SaveChanges», а затем связать зависимый с новым принципала «. Тем не менее, я не могу удалить зависимый, как это запись мне нужно обновить. Это код .. общественный BOOL UpdateGovernor (губернатор updatedGovernor, пользователь Пользователя) {попробуйте {Губернатор myGovernor = _ctx.Governors .гд (и => u.Id == updatedGovernor.Id) .INCLUDE (я => i.EthnicOrigin) .INCLUDE (и => u.Tenant) .FirstOrDefault (); если (myGovernor.Tenant.Id == user.Tenant.Id) {_ctx.Entry (myGovernor) .CurrentValues.SetValues ​​(updatedGovernor); _ctx.Entry (myGovernor) .State = EntityState.Modified; _ctx.Entry (myGovernor.EthnicOrigin) .CurrentValues.SetValues ​​(updatedGovernor.EthnicOrigin); возвращает истину; } Еще {строка ошибки = "Наниматель нарушение" + Environment.NewLine; Ошибка + = "Пользователь:" + user.emailAddress.ToString () + Environment.NewLine; Ошибка + = "Обновленный губернатор:" + updatedGovernor.Id.ToString () + Environment.NewLine; _logger.LogError ($ "Не удалось обновить правителю: {ошибка}"); вернуться ложным; }} Поймать (Exception ех) {_logger.LogError ($ "Не удалось обновить губернатора: {ек}"); вернуться ложным; }} ToString () + Environment.NewLine; _logger.LogError ($ "Не удалось обновить правителю: {ошибка}"); вернуться ложным; }} Поймать (Exception ех) {_logger.LogError ($ "Не удалось обновить губернатора: {ек}"); вернуться ложным; }} ToString () + Environment.NewLine; _logger.LogError ($ "Не удалось обновить правителю: {ошибка}"); вернуться ложным; }} Поймать (Exception ех) {_logger.LogError ($ "Не удалось обновить губернатора: {ек}"); вернуться ложным; }}
Paul Hepple
1

голосов
0

ответ
122

Просмотры

Disable delete cascade on one to many in same table Entity Framework core

Это мой стол, так что пользователь может иметь менеджер, который также является пользователь: класс пользователя открытым: IdentityUser {публичной строка ПгвЬЫате {получить; задавать; } Публичная строка LastName {получить; задавать; } Общественного ИНТ? AttachedManagerId {получить; задавать; } Общественного ApplicationUser AttachedManager {получить; задавать; }} И это попытаться отключить удаление присоединенных пользователей, когда менеджер будет удален: ApplicationDbContext общественного класса: IdentityDbContext {защищены переопределения недействительного OnModelCreating (ModelBuilder MODELBUILDER) {base.OnModelCreating (MODELBUILDER); modelBuilder.Entity () .HasOne (с => s.AttachedManager) .WithMany () .HasForeignKey (с => s.AttachedManagerId) .OnDelete (DeleteBehavior.SetNull); }} Когда я добавить миграцию, она генерирует это: migrationBuilder. AddForeignKey (название: "FK_AspNetUsers_AspNetUsers_AttachedManagerId", таблица: "AspNetUsers", колонка: "AttachedManagerId", principalTable: "AspNetUsers", principalColumn: "Идентификатор", OnDelete: ReferentialAction.SetNull); так что я эту ошибку: Произошла ошибка при вызове метода «BuildWebHost» на классе «Программы». Продолжая без поставщика услуг доступа к приложениям. Ошибка: Введение внешнего ключа «FK_AspNetUsers_AspNetUsers_AttachedManagerId» на столе «AspNetUsers» может вызвать циклов или несколько путей каскада. Укажите ON УДАЛИТЬ NO ACTION или ON UPDATE NO ACTION или изменять другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Просмотреть предыдущие ошибки. Таблица: "AspNetUsers", колонка: "AttachedManagerId", principalTable: "AspNetUsers", principalColumn: "Идентификатор", OnDelete: ReferentialAction.SetNull); так что я эту ошибку: Произошла ошибка при вызове метода «BuildWebHost» на классе «Программы». Продолжая без поставщика услуг доступа к приложениям. Ошибка: Введение внешнего ключа «FK_AspNetUsers_AspNetUsers_AttachedManagerId» на столе «AspNetUsers» может вызвать циклов или несколько путей каскада. Укажите ON УДАЛИТЬ NO ACTION или ON UPDATE NO ACTION или изменять другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Просмотреть предыдущие ошибки. Таблица: "AspNetUsers", колонка: "AttachedManagerId", principalTable: "AspNetUsers", principalColumn: "Идентификатор", OnDelete: ReferentialAction.SetNull); так что я эту ошибку: Произошла ошибка при вызове метода «BuildWebHost» на классе «Программы». Продолжая без поставщика услуг доступа к приложениям. Ошибка: Введение внешнего ключа «FK_AspNetUsers_AspNetUsers_AttachedManagerId» на столе «AspNetUsers» может вызвать циклов или несколько путей каскада. Укажите ON УДАЛИТЬ NO ACTION или ON UPDATE NO ACTION или изменять другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Просмотреть предыдущие ошибки. FK_AspNetUsers_AspNetUsers_AttachedManagerId»на столе„AspNetUsers“может вызвать циклы или несколько путей порогов. Укажите ON УДАЛИТЬ NO ACTION или ON UPDATE NO ACTION или изменять другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Просмотреть предыдущие ошибки. FK_AspNetUsers_AspNetUsers_AttachedManagerId»на столе„AspNetUsers“может вызвать циклы или несколько путей порогов. Укажите ON УДАЛИТЬ NO ACTION или ON UPDATE NO ACTION или изменять другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Просмотреть предыдущие ошибки.
Lucas Weibel
1

голосов
0

ответ
29

Просмотры

I can't do a POST with EF Core

with a new problem, it's because with Entity framework core web api i can't do a POST request. But if i write the same sentence in Sql Server it works. Here is my POST: public IActionResult PostEstacion([FromBody]PostEstacionDTO postEstacionDTO) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var EntidadID = _context.Empresa.Where(x => x.EntidadID == postEstacionDTO.EntidadID).Select(x => x.EntidadID).FirstOrDefault(); var NumeroEstacion = _context.Estacion.Where(x => x.NumeroEstacion == postEstacionDTO.NumeroEstacion).Select(x => x.NumeroEstacion).FirstOrDefault(); var Clave = _context.Estacion.Where(x => x.Clave == postEstacionDTO.Clave).Select(x => x.Clave).FirstOrDefault(); var TarID = _context.Estacion.Where(x => x.TarID == postEstacionDTO.TarID).Select(x => x.TarID).FirstOrDefault(); var postEstacion = _context.LoadStoredProc("PostEmpresaEstacion") .WithSqlParam("p0", EntidadID) .WithSqlParam("p2", NumeroEstacion) .WithSqlParam("p3", Clave) .WithSqlParam("p4", TarID) .ExecuteStoredProc(); return Created(); } I use a class to execute SP from SQL Server, in another Post request it works, but here it's not. For example if i debugging: Here is my SP: [dbo].[PostEmpresaEstacion] @p0 int, @p2 varchar (max), @p3 varchar (max), @p4 int as begin insert into Empresa(EntidadID) values (@p0) SELECT P1 = SCOPE_IDENTITY() insert into Estacion(EmpresaID, NumeroEstacion, Clave, TarID) values (SCOPE_IDENTITY(), @p2, @p3, @p4) end And here is my Postman POST Request And finally my query from my SP: declare @p0 int, @p2 varchar (max), @p3 varchar (max), @p4 int set @p0 = 1 set @p2 = 'ZXSQ12' set @p3 = 'OPIIU7' set @p4 = 1 begin insert into Empresa(EntidadID) values (@p0) SELECT P1 = SCOPE_IDENTITY() insert into Estacion(EmpresaID, NumeroEstacion, Clave, TarID) values (SCOPE_IDENTITY(), @p2, @p3, @p4) end As I said, it works perfect in Sql Server. When i debugging in Visual Studio: EntidadID = 1 NumeroEstacion = null Clave = null TarID = 2 Only "NumeroEstacion" and "Clave" are null, and i don´t know why, if i declare the variables as the others. I will appreciate your help
1

голосов
1

ответ
266

Просмотры

_Context.SaveChangesAsync () не выполняется в командной строке

Я использовал _Context.SaveChangesAsync () во многих местах в моем проекте, и он отлично работает, за исключением того, здесь // хэш пароля изменить логическое значение ложного набора соли сохранения ждут TryUpdateModelAsync (пользователя); Хэш хэш = новый хэш (); Строка соль = hash.CreateSalt (); user.Salt = соль; user.Password = hash.HashPassword (новый_пароль, соль); user.ChangePassword = ложь; ждут _Context.SaveChangesAsync (); Состояние модели верно, и оно должно работать нормально, но даже в командной строке (Microsoft.EntityFrameworkCore.Database.Command) не показывает на всех, и база данных не обновляется, не ошибка или исключение не бросают какие-либо идеи? это весь класс общественного класса ChangePasswordModel: PageModel {публичная строка CurrentPassword {множество; получить; } Публичная строка NewPassword {множество; получить; } Общего пользователя Пользователь {установлен; получить; } Частных чтения PROJECTDATABASE_MDFContext _Context; общественного ChangePasswordModel (PROJECTDATABASE_MDFContext DatabaseContext) {_Context = DatabaseContext; } Общественного недействительными OnGet () {} общественного асинхронной Task OnPostAsync () {INT TempId = 0; попробуйте {TempId = Convert.ToInt32 (User.FindFirst (претензия => claim.Type == System.Security.Claims.ClaimTypes.NameIdentifier) ​​?. Value); } Поймать {}, если (TempId> 0) {пользователь = новый пользователь (); пользовательские = ждут _Context.User.AsNoTracking (). Включить (т => m.Role) .FirstOrDefaultAsync (м => m.UserId == TempId); если (пользователь! = NULL) {CurrentPassword = Request.Form [ "CurrentPassword"]; Новый_пароль = Request.Form [ "новый_пароль"]; // если пароль хешируется если (user.ChangePassword == FALSE) {Hash хэш = новый Hash (); CurrentPassword = hash.HashPassword (CurrentPassword, user.Salt); } Если (user.Password == CurrentPassword) {если (NewPassword.Length> = 8) {// хэш пароля изменить логическое значение для ложного набора сохранить соль ждать TryUpdateModelAsync (пользователь); Хэш хэш = новый хэш (); Строка соль = hash.CreateSalt (); user.Salt = соль; user.Password = hash.HashPassword (новый_пароль, соль); user.ChangePassword = ложь; ждут _Context.SaveChangesAsync (); если (user.Role.RoleName == "Student") {вернуться RedirectToPage ( "Пользователи / StudentProfile", новый {идентификатор = user.UserId}); } Еще {вернуть RedirectToPage ( "Пользователи / StaffMemberProfile", новый {идентификатор = user.UserId}); }} Еще {ModelState.AddModelError (» }}} Вернуть страницу (); }} До сохранения пользователя заполняются правильно с обновленными значениями, так что проблема не в методе хэша }}} Вернуть страницу (); }} До сохранения пользователя заполняются правильно с обновленными значениями, так что проблема не в методе хэша
Doaa Radwan
1

голосов
1

ответ
145

Просмотры

Добавление сущности к DbSet не помечает объект как добавленный и, следовательно, не совершил

Я создал образец репо демо проблему. Сущности: класс Person общественного {общественного ИНТ Id {получить; задавать; } Публичная строка Name {получить; задавать; }} Общественного класса Атрибуты {общественного Person Person {получить; задавать; } публичная строка Attribs {получить; задавать; }} DbContext Конфигурация защищена переопределение недействительными OnModelCreating (ModelBuilder MODELBUILDER) {base.OnModelCreating (MODELBUILDER); modelBuilder.Entity () .Property Свойство ( "PersonId"); modelBuilder.Entity () .HasKey ( "PersonId"); modelBuilder.Entity () .HasOne (_ => _.Person) .WithOne () .IsRequired (); modelBuilder.Entity () .Property Свойство (_ => _.Attribs) .HasColumnName ( "Атрибуты"); } То, что работает очень хорошо для атрибутов? Read Update Delete Создать не работает. Даже если новый экземпляр атрибутов добавляется в DbSet он не помечен как добавленный и, таким образом, не поручены к БД. Маркировка состояния лица в явном виде Добавлено совершает экземпляр правильно БД. Это эксплицитность необходима только для атрибутов. Все другие объекты в моем реальном проекте добавлены правильно через DbSet.Add (). Что случилось с моими ожиданиями? статической силы Main (строка [] арг) {используя (вар DbContext = новый контекст ()) {// чтение хорошо работает вар readEntity = dbContext.Set () .Первый (_ => _.Person.Id == 1); Console.WriteLine ($ "Read объект имеет атрибуты значение: {readEntity.Attribs}"); }, Используя (VAR DbContext = новый контекст ()) {вар человек = dbContext.Set () Первый (_ => _.Id == 2). вар атрибуты = новые атрибуты {Человек = Человек, Attribs = "некоторые"}; вар состояние = dbContext.Set () Добавить (атрибуты). Console.WriteLine ($ "Состояние: {state.State}"); кол-вар = dbContext.SaveChanges (); ЕЫпе ($ "Изменения написано: {число}"); если (кол == 0) {Console.WriteLine ( «Попытка снова с явной установкой состояния сущности добавленным.»); state.State = Microsoft.EntityFrameworkCore.EntityState.Added; кол = dbContext.SaveChanges (); Console.WriteLine ($ "Изменения, написанные во второй попытке: {число}"); } } Приставка. WriteLine ( "Done"); Console.ReadLine (); }
MarcusK
1

голосов
0

ответ
50

Просмотры

Entity Framework Ядро не создает миграции автоматически

Я хотел бы создать таблицу при запуске с Entity Framework. У меня есть контекст в отдельном проекте. Startup.cs в методе:. Настройка (IApplicationBuilder приложение) попробовать {используя (. Объем вар = app.ApplicationServices.GetService () CreateScope ()) {scope.ServiceProvider.GetRequiredService () Database.Migrate (); }} Задвижка (Исключение ех) {выбросить; } Этот кусок кода не создает таблицу. Однако, когда я пытался создать миграцию путем Dotnet эф миграции добавить AddTable_CLient -c MyContext. Таблица создается, но scope.ServiceProvider.GetRequiredService () Database.Migrate (). оленья кожа создать таблицу для меня. И это показывает таблица была создана уже. DesignTimeDbContextFactory общественного класса: IDesignTimeDbContextFactory {общественного MyContext CreateDbContext (строка [] арг) {вар строитель = новый DbContextOptionsBuilder (); builder.UseSqlServer ( "Server = локальный; Database = ClientManagement; Trusted_Connection = True; MultipleActiveResultSets = истина", optionsBuilder => optionsBuilder.MigrationsAssembly (TypeOf (MyContext) .GetTypeInfo () Assembly.GetName () Name)..); возвращают новые VerittyContext (builder.Options); }} MyContext.cs общественного DbSet Компания {получить; задавать; } Общественного DbSet CompanyContact {получить; задавать; } Защищен переопределение недействительными OnModelCreating (ModelBuilder MODELBUILDER) {Еогеасп (. Вар отношения в modelBuilder.Model.GetEntityTypes () SelectMany (е => e.GetForeignKeys ())) {relationship.DeleteBehavior = DeleteBehavior.Restrict; } Base.OnModelCreating (MODELBUILDER); modelBuilder.Entity (); modelBuilder.Entity (); } Я хотел таблицу автоматически создается, когда таблица добавляется в класс Context. Я не хотел, чтобы добавить миграции вручную. Есть ли с помощью кода ниже, не так, как добавить таблицу в базу данных автоматически? используя (вар сфера = app.ApplicationServices.GetService () CreateScope ().) {scope.ServiceProvider.GetRequiredService () Database.Migrate (). } Пожалуйста помоги. Перенос (); } Пожалуйста помоги. Перенос (); } Пожалуйста помоги.
aakash
1

голосов
0

ответ
36

Просмотры

Является ли «OnDelete» приходит к первоначальному Entity Framework?

Я вижу, путем быстрого поиска Google, что Entity Framework Ядро имеет метод, называемый «OnDelete», который принимает перечисление, чтобы установить определенное по умолчанию ON DELETE поведения. Ближайший эквивалентный метод в Entity Framework является «WillCascadeOnDelete», который является ужасно жестким и unflexible метод, учитывая, что есть 4 возможных вариантов, которые могут быть выбраны для эквивалентных SQL «ON DELETE» триггера. Таким образом, рамки Ядро получить это правильно, но это даже доступно в оригинальной Entity Framework? Это поднимает более общий вопрос по этой теме. Что такое «общая» дорожная карта в отношении этих технологий, которые очень похожи. Они расходятся, сходящиеся, или бег на отдельных, но параллельных дорожках в обозримом будущем? Не является методы соотношения между этими двумя технологиями, стремящейся целью или нет?
Bradley
1

голосов
0

ответ
81

Просмотры

В. С. Отладчик показывает текущее значение в цикле Еогеаспа как нуль, когда это не так

В некоторых ситуациях, когда я пытаюсь отлаживать цикл Еогеаспа, я не могу видеть текущее значение в отладчике. Он будет бросать исключение нулевой ссылки, если я пытаюсь оценить его в часах, в то время как код будет выполняться без каких-либо проблем. Я не 100% уверен, но это, кажется, происходит, когда я итерацию по списку, что я извлеченный с помощью EF Core. вар бар = ждут context.Bars.Include (б => b.Barlets) .ToListAsync (); Еогеасп (вар Foo в барах) {вар Boop = Foo; / * Делать вещи с Foo * /} Если установить контрольную точку в середине цикла, Foo будет нулевым. В то же точки останова можно просмотреть содержимое бара без проблем и ни одно из значений не равны нулю. Я могу также просмотреть содержимое Boop просто отлично, но не Foo, даже сразу после выполнения задания.
1

голосов
1

ответ
641

Просмотры

Какой срок службы-менеджер зарегистрировать свою DbContext в контейнер Unity при написании приложения WPF?

Я пишу новый C # приложение на вершине Prism 6.3 рамок, используя хорошо известный шаблон проектирования MVVM. Я использую Unity IoC контейнер, чтобы помочь мне управлять своими зависимостями. Я использую Entity Framework Ядро для взаимодействия с базой данных. Тем не менее, я не хочу, чтобы плотно пару моего приложения Entity Framework Ядро, поэтому я реализовал модель Repository и UnitOfWork, чтобы сделать его легким для меня, чтобы поменять реализацию Entity Framework Core, если это необходимо. Мой репозиторий реализация предоставляет метод Save (), который вызывает метод SaveChanges EF сердечника (). Хранилища впрыскивается в мой бизнес-службы, чтобы мой бизнес-сервис позволяет выявить один способ сделать одну задачу. Например, если я хочу, чтобы создать новый заказ, Я хотел бы вызвать метод Create (orderViewModel), который внутренне вызывает Add () и метод Save () на OrderRepository. Кроме того, UnitOfWork предоставляет Save (), BeginTransaction (), Commit () и Откат () методы, которые позволяют мне контролировать поведение транзакции. Другими словами, это даст мне гибкость либо принять или при необходимости отката транзакции SQL. Для того, чтобы объяснить свое дело лучше использовать, вот пример того, как я хотел бы добавить новый порядок в свою базу данных непосредственно с помощью бизнес-услуги без операции или единицы произведенной работы. OrdersService.Create (orderViewModel); // это будет вызывать `Add`, а` Save () `методы на OrderRepository; Вот еще один пример, который продемонстрирует, как я хотел бы добавить новый порядок и порядок-элементы в мою базу данных, используя бизнес-услуги, используя блок-оф-работы, чтобы начать транзакцию и контролировать сделку. используя (вар транзакции = UnitOfWork.BeginTransaction ()) {{попытаться уаг порядок = OrdersService.Create (orderViewModel); OrdersService.CreateRange (order.Id, orderItemsViewModel); transaction.Commit (); } Задвижка (Исключение е) {Log.Add (е); transaction.RollBack (); }} Во втором примере выше, даже, несмотря на то, OrdersService.Save и OrdersService.SaveRange каждый называют SaveChanges () метод данные не фиксируются в базе данных, так как я обмотав их сделки. Вопрос: что LifeTimeManager я должен зарегистрировать DbContext, IUnitOfWork и каждый из моих хранилищ с? В веб-среде, я бы зарегистрировать все, используя PerRequestLifetimeManager то при запросе я повторное использование тот же DbContext и все работает отлично и DbContext расположена в конце запроса HTTP. Но не уверен, как зарегистрировать все в приложении WPF, где я могу по-прежнему использовать транзакцию, чтобы контролировать все, позволяя при этом хранилище для вызова SaveChanges () При необходимости здесь мой EntityRepository реализация общественного класса EntityRepository: IRepository где TEntity: класс, где TKeyType: структура {защищенного контекста чтения DbContext; защищенный DbSet DbSet только для чтения; общественный EntityRepository (DbContext контекст) {Контекст = контекст; DbSet = context.Set (); } Общественного TEntity Get (TKeyType ID) {вернуться DbSet. Найти (идентификатор); } Общественного IEnumerable GETALL () {вернуть DbSet.ToList (); } Общественного BOOL Любого (Выражение предикат) {возвращают DbSet.Any (предикат); } Общественного IQueryable Find (Expression предикат) {вернуть DbSet.Where (предикат); } Общественного TEntity SingleOrDefault (Выражение предикат) {возвращают DbSet.SingleOrDefault (предикат); } Общественного виртуального TEntity Добавить (TEntity объект) {вар запись = Context.Add (лица); record.State = EntityState.Added; вернуть объект; } общественного виртуального IEnumerable AddRange (IEnumerable лица) {Context.AddRange (субъекты); возвращать объекты; } Общественных недействительный Удалить (TEntity лицо) {Context.Remove (юридическое лицо) .State = EntityState.Deleted; } общественного недействительными RemoveRange (IEnumerable лица) {Context.RemoveRange (юридические лица); } Общественного недействительный Update (TEntity объект) {DbSet.Attach (юридическое лицо); вар запись = Context.Entry (юридическое лицо); record.State = EntityState.Modified; } Общественных IQueryable запросов () {вернуть DbSet; } Общественного недействительный Save () {Context.SaveChanges (); }} А вот мое подразделение общественного осуществления работы запечатан класс UnitOfWork: IUnitOfWork {частного BOOL IsDisposed = ложь; частное чтение DbContext контекста; общественного IOrderRepository Заказы {получить; частный набор; } Общественного IOrderItemRepository ТоварыЗаказа {получить; частный набор; } Общественного UnitOfWork (DbContext контекст) {Контекст = контекст; Заказы = новый OrderRepository (контекст); ТоварыЗаказ = новый OrderItemRepository (контекст); } Общественного ИНТ Save () {Context.SaveChanges (); возвращать 0; } Общественного недействительными Dispose () {Dispose (истина); } Общественного IDatabaseTransaction BeginTransaction () {вернуть новый EntityDatabaseTransaction (Context); } Частные недействительными Dispose (BOOL утилизации) {если (IsDisposed) {возвращение; } Если (утилизации) {Context.Dispose (); } IsDisposed = TRUE; }} } Частные недействительными Dispose (BOOL утилизации) {если (IsDisposed) {возвращение; } Если (утилизации) {Context.Dispose (); } IsDisposed = TRUE; }} } Частные недействительными Dispose (BOOL утилизации) {если (IsDisposed) {возвращение; } Если (утилизации) {Context.Dispose (); } IsDisposed = TRUE; }}
Mike A
1

голосов
0

ответ
352

Просмотры

EF Жила - EntityTypeBuilder один ко многим отношений?

Я немного запутался, о том, как сделать отношения в EF Ядра 2.1. Я делал это текучий путем. У меня есть Сотрудник общественного класса: IdentityUser {общественного ИНТ BranchId {получить; задавать; } Branch Branch общественного {получить; задавать; }} Общественного класса Branch {общественного ИНТ Id {получить; задавать; } Общественного ИНТ CompanyID {получить; задавать; } Публичная Компания {получить; задавать; } общественного ICollection Сотрудники {получить; задавать; }} Общественного класса EmployeerConfig: IEntityTypeConfiguration {общественного недействительными Настройка (EntityTypeBuilder строитель) {builder.ToTable ( "Сотрудники"); }} Общественного класса BranchConfig: IEntityTypeConfiguration {общественного недействительными Настройка (EntityTypeBuilder строитель) {builder.HasKey (х => x.Id); builder.Property (х => x.Id) .ValueGeneratedOnAdd (); builder.HasMany (х => x.Employees); builder.ToTable ( "ветвь"); }} Все примеры, которые я видел в основном использовать DbContext модель строитель, но таким образом больше не нужен, как вы можете использовать разделить его, как я сделал. Я сделал мои отношения 2 способа первым для компании и отделения я даже не указывать отношения пока я пошел строить свой дб это знает, однако, когда я пытаюсь сделать это с Работником и Branch отношения не было сформировано. Это заставило меня добавить builder.HasMany (х => x.Employees) в ветви конфигурации и теперь отношения работает, но я не уверен, если у меня есть что-то указать в области Сотрудника, чтобы закончить? Я также не знаю, если мне нужно еще добавить виртуальный в моей коллекции больше, и поэтому, если я не использую ToTable () и строить свою БД, все имена таблиц сокращены,
chobo2
1

голосов
2

ответ
26

Просмотры

Навигация свойство возвращает нуль?

класс Тема {общественного ИНТА TopicID {получить, установить;} публичное виртуальное ICollection сообщение {получить; задавать; } Общественное сообщение Firstpost {получить {вернуться this.Posts.OrderBy (р => p.PostedDate) .FirstOrDefault (); }}} Класс Поста {общественное ИНТ {получить сообщения дан; набор; } Общественного {INT TopicID получить; установить;} общественного DateTime PostedDate {получить; набор;} общественной виртуальной темы Тема {получит; набор;}} переменная запроса = Database.Forums.Where (р => p.Id == ID). Выберите (р => {новый p.Title, темы = p.Topics.OrderByDescending (р => p.LastPostedDate) .Select (т => новый {t.TopicId, t.FirstPost.PostId})}). ToList ( ); Когда я запускаю этот запрос, t.FirstPost равно нулю, даже если тема действительно есть сообщения в базе данных. Есть ли способ сделать это, используя навигационные свойства вместо того, чтобы использовать синтаксис запросов и соединяющий?
firebird
1

голосов
0

ответ
307

Просмотры

Entity Framework Основные Вложенные транзакции или обновление DbContext среди SaveChanges ()

У меня есть этот API, который удаляет и добавляет различных пользователей в базе данных. Путь этот API написано что-то вроде этого: / * Предполагая, что «пользователи» является массив пользователей для удаления (если пользователи [х] .toDelete == верно), или добавить в противном случае * /, используя (вар дб = новый myContext ()) {используя (вар dbTransaction = db.Database.BeginTransaction ()) {попробуйте {/ * Выполнение удаление пользователей в БД * / SaveChanges (); / * Выполнение добавления пользователей в БД * / Еогеасп (пользователь пользователей), если (user.toDelete!) {Db.users.add (..); db.SaveChanges (); } DbTransaction.Commit (); } Задвижка (ValidationException ех) {dbTransaction.Rollback (); }}} Причина, почему я использую сделки является то, что у меня есть некоторые валидации, которые должны выполняться на новых данных .. Например, я не могу добавить два пользователя с той же электронной почтой! Все проверки на стороне сервера осуществляется с помощью Data-аннотаций и классов метаданным, поэтому я создал атрибут уникальности, которую я связанный к свойству эл.адрес класса UserMetaData. Таким образом, проблема заключается в том, что внутри однозначности атрибута мне нужно еще раз проверить базу данных для поиска других пользователей с той же электронной почтой: класс IsUnique общественности: ValidationAttribute {защищенное переопределение ValidationResult IsValid (значение объекта, ValidationContext validationContext) {... используя (вар дб = новая myContext ()) {/ * Здесь я выполнить выбор на БДЕ ищет запись с той же электронной почтой, все с помощью отражения. * / Если (recordFound> 0) возвращает новый ValidationResult ( "электронная почта уже существует"); вернуться ValidationResult.Success; }}} Итак, как вы можете видеть, внутри проверки я использую новый myContext () и что там проблема: давайте представим, что у меня есть пустую базу данных и добавить два пользователя с той же электронной почты в том же запросе. Как вы можете видеть, я называю db.SaveChanges () после того, как каждый пользователь был добавлен, поэтому я подумал, что, когда второй пользователь будет добавлен бы был проверен, моя проверка знала бы, что первый добавил пользователь и второй один имеет тот же адрес электронной почты, следовательно, проверка исключений была бы бросок и dbTransaction.Rollback () называется. Проблема заключается в том, что внутри валидатора я называю новые myContext () и в этом контексте те изменения, которые я думал, что бы там благодарность db.SaveChanges () там arent't, и это, я думаю, потому что все изменения внутри сделка. Тааак .. Решение я думал, что до сих пор является две: вложенной Сделка: в API У меня есть внешняя трансакция, сохранить состояние БД в начале, то какие-то внутренние транзакции запускаются каждый раз, когда db.SaveChanges () называется , Делая это, проверка действительно видит изменения, но проблема заключается в том, что, если в улове я назвал outerTransaction.rollback (), изменения, внесенные внутренними сделки не rollbacked; Некоторые из способов, чтобы получить контекст, который я использовал в API даже в проверке .. Но там у меня есть только эти два аргумента, так что я, если это не знаю
Jolly
1

голосов
1

ответ
162

Просмотры

How to create relationships between entities with existing database that does not contain foreign keys

Использование Entity Framework Ядро 2.0 Прикрепленные с производственной базой компании, которая имеет первичные ключи, определенные для каждой таблицы, но никаких внешних ключей, определенных для любых отношений. Зависимые записи в базе данных имеют идентификаторов полей, которые предназначены для связаны с полей первичного ключа в родительской записи, как вы обычно найти с внешнего ключа отношения / ограничения. Но эти поля были созданы как INT NOT NULL и с помощью SQL по умолчанию «0». В результате зависимые записи были вставлены в течение долгого времени, не требуя связанную родительскую запись быть указана. Изначально я определил мои модели в EF с целыми числами и использовал свободно конфигурацию, чтобы указать «требуется копаться». Это было сделано, чтобы я мог запустить миграции, чтобы создать тестовую базу данных для сравнения с производственной базой данных, чтобы убедиться, что мой код первым правильно закодирован. Затем это приводит к проблеме, используя «Включить» в моих Linq запросах, которые выполняют внутреннее соединение, что приводит к падению записи, которые содержат 0 'в Ид полях зависимой записи. Единственный способ, который я нашел, чтобы сделать эту работу, чтобы смоделировать все поля Ид в зависимой сущности в обнуляемого целых чисел и удалить «требуется копаться» от беглой конфигурации. При использовании «Включить» выполняет левое внешнее соединение сохраняя все зависимые общества. Это также означает, что любые ссылки на свойства включенных лиц устанавливается на нуль вместо пустой строки. Эта часть, вероятно, может быть исправлено довольно легко. Недостаток является то, если бы я хотел использовать миграции для создания базы данных в настоящее время, все поля идентификаторов в зависимых записях будут созданы, как NULL. Есть ли кто-нибудь, кто наталкиваются такой ситуации? Кто-нибудь есть какие-либо предложения попробовать другой, чем подход, который я использую?
JakRuzL
1

голосов
1

ответ
145

Просмотры

.net ядра 2.1.x EntityFramework | DatabaseGeneratedAttribute аннотации не может быть найден

Я пытаюсь использовать .Net Framework Entity сердечников для моего приложения. Соответствующие части из .csproj файлов являются: В моих классах сущностей я использую аннотации, как описано в данном руководстве. Тем не менее, моя сборка терпит неудачу с ошибками, например: CS0246 ошибки: Тип или пространство имен «DatabaseGeneratedAttribute» не может быть найден (вы пропали без вести с помощью директивы или ссылка на сборку?) Я включил необходимости «используя» заявления в коде. Тем не менее ошибка, кажется, сохраняется. Любые указатели / предложения, что нужно проверить для того, чтобы решить эту проблему будет очень цениться. Я занимаюсь разработкой с использованием VS кода на MacOS. Заранее спасибо!
b.sodhi
1

голосов
0

ответ
78

Просмотры

Как заставить порядок в миграции в C # EF сердечнике 2,0-код первого

У меня есть две таблицы: «Родители» и «Дети»: открытый класс Parent {общественный ИНТ Id {получить; задавать; } Публичная строка ExternalId {получить; задавать; } Публичная строка Описание {получить; задавать; }} Общественного класса Child {общественного ИНТ Id {получить; задавать; } Публичная строка ExternalId {получить; задавать; } Публичная строка Описание {получить; задавать; } Публичная строка ParentExternalId {получить; задавать; }} Это создаст следующий SQL скрипт: IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20171222072010_Initial ') НАЧАТЬ CREATE TABLE [Родители] ([Id] INT NOT NULL IDENTITY, [ExternalId] NVARCHAR ( 50) NOT NULL, [Описание] NVARCHAR (300) NULL, скованность [PK_Parents] ПЕРВИЧНЫЙ КЛЮЧ ([Id])); КОНЕЦ; ЕСЛИ НЕ СУЩЕСТВУЕТ (SELECT * FROM [__EFMigrationsHistory] ГДЕ [MigrationId] = N» 20171222072010_Initial ') НАЧАТЬ CREATE TABLE [Дети] ([Id] INT NOT NULL IDENTITY, [ExternalId] NVARCHAR (50) NOT NULL, [Описание] NVARCHAR (300) NULL, [ParentExternalId] NVARCHAR (50) NOT NULL, CONSTRAINT [PK_Children ] ПЕРВИЧНЫЙ КЛЮЧ ([Id])); КОНЕЦ; Теперь я изменить внешний ключ в ребенке: общественный класс для детей {общественного ИНТА Id {получить; задавать; } Публичная строка ExternalId {получить; задавать; } Публичная строка Описание {получить; задавать; } #Region внешние ключи общественности INT ParentId {получить; задавать; } Общественного Родитель Родитель {получить; задавать; } #Endregion внешние ключи} Это создает этот SQL скрипт: IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20180604085531_ChangeForeignKey ') BEGIN DECLARE @ var49 SysName; ВЫБОР @ var49 = [d]. [Имя] FROM [SYS]. [Default_constraints] [d] INNER JOIN [SYS]. [Столбцы] [с] ВКЛ [d]. [Parent_column_id] = [с]. [Column_id] и [D]. [Parent_object_id] = [с]. [Object_id] Где (. [d] [parent_object_id] = OBJECT_ID (N'Children ') и [с] [имя] = N'ParentExternalId'); IF @ var49 IS NOT NULL EXEC (N'ALTER TABLE [Операции] DROP CONSTRAINT [»+ @ var49 + '];'); ALTER TABLE [Дети] DROP COLUMN [ParentExternalId]; КОНЕЦ; GO IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20180604085531_ChangeForeignKey ') НАЧАТЬ ALTER TABLE [Дети] ADD [ParentId] INT NOT NULL DEFAULT 0; КОНЕЦ; GO IF NOT EXISTS (SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20180604085531_ChangeForeignKey» ) НАЧАТЬ ALTER TABLE [Дети] ADD CONSTRAINT [FK_Children_Parents_ParentId] FOREIGN KEY ([ParentId]) ЛИТЕРАТУРА [Родители] ([Id]) ON УДАЛИТЬ NO ACTION; КОНЕЦ; GO Из-за того, в миграции, я освобождаю данные. Я хочу, чтобы сценарий первого добавить новый столбец «ParentID», а затем обновить новую колонку и после этого, падение колонки «ParentExternalId». Есть ли способ, что я могу заставить это?
Richard
1

голосов
2

ответ
337

Просмотры

Entity Framework и PostgreSQL: кавычки вопрос

Проблема я столкнулся вокруг запросов SQL в pgAdmin 4. Entity Framework (включая ее ядро ​​редакции) заглавной имена таблиц и столбцов. Что означает, что ваш SQL будет выглядеть примерно так выберите е. «Id», е. «Текст» из «записей» е, где е. «Текст», как «% замешано%» я погуглить способ предотвратить Entity Framework с прописных букв имен но не узнал много. Есть обходной путь, чтобы избежать оборачивать имена таблиц и столбцов в кавычках? Заранее спасибо!
Alex Herman
1

голосов
1

ответ
55

Просмотры

EF trying to create new entry instead of relation

У меня есть модель пользователя и модель UserRole. В базе данных UserRole является переписчик (визуализируется ниже). Когда я инициализация базы данных, таблица пользователей имеет столбец UserRoleId, поэтому я предположил, что Entity Framework сделал отношение правильно. Однако, когда я пытаюсь добавить пользователя, я получаю сообщение об ошибке, что EF пытается создать новую запись в таблице UserRole. Я не хочу, чтобы создать новую запись в таблице UserRole, я хочу, число, которое будет вставлено в столбец UserRoleId таблицы пользователей, что ссылки на роль в таблице UserRole. Ошибка: Microsoft.EntityFrameworkCore.Database.Command: Ошибка: Не удалось выполнения DbCommand (2ms) [Параметры = [@ p0 = '?' (DbType = Int32), @ p1 = '?' (Размер = 4000)], CommandType = 'Текст', CommandTimeout = '30' ] SET NOCOUNT ВКЛ; INSERT INTO [UserRoles] ([Id], [Роль]) VALUES (@ p0, @ P1); System.Data.SqlClient.SqlException (0x80131904): не удается вставить явное значение для столбца идентификаторов в таблице «UserRoles», когда IDENTITY_INSERT установлен в положение OFF. UserRoles Таблица в БД: ID | Роль ============== 1 | Телезритель 2 | Владелец 3 | Действия администратора: Модели общественного класса пользователя {общественности INT Id {получить; задавать; } Публичная строка {Имя пользователя получить; задавать; } Общественных байт [] {PasswordHash получить; задавать; } Общественных байт [] {PasswordSalt получить; задавать; } Общественного UserRole UserRole {получить; задавать; } // } Общественных байт [] {PasswordHash получить; задавать; } Общественных байт [] {PasswordSalt получить; задавать; } Общественного UserRole UserRole {получить; задавать; } // } Общественных байт [] {PasswordHash получить; задавать; } Общественных байт [] {PasswordSalt получить; задавать; } Общественного UserRole UserRole {получить; задавать; } //
JED
1

голосов
0

ответ
62

Просмотры

Как легко использовать классы POCO, которые имеют ссылку на третьей стороной POCO класса - .NET ядра EF

Это сообщение является довольно специфическим, но плохо попытаться обобщить его как можно больше. Без прыжков непосредственно во всей справочной информации, главный вопрос: Что является лучшим способом или реализации, для проекта API сборки в .NET Core 2 и EF Ядра, чтобы легко использовать свой собственный набор классов POCO, которые имеют ссылку на третья сторона их классы POCO, и с повторным использованием, я имею в виду, что ваши собственные классы POCO не должны полагаться на третью сторону их свойства класса POCO, но ваши конечные точки должны все еще быть в состоянии (легко) получить данные (значения / свойства) из классы третьего участника POCO. Легко написать конечные точки, которые получают поля и значение собственных классов POCO и третья сторону их классы POCO, используя простой .INCLUDE и, убедившись, что упоминаемая таблица / ПОКО класс находится в своем собственном классе POCO. Это, однако, также означает, что, когда третья сторона становится другой стороной, все конечные точки должны быть переписаны, потому что новая третья сторона имеет свой собственный набор свойств / классов POCO. Наша функциональность интерфейсных / приложение, однако, более или менее остаются теми же, и третья сторона их ценности / свойства являются более или менее то же самое (называние / установить для определенных таблиц или столбцов могут быть разными, хотя). Некоторые справочная информация я постараюсь извлечь из текущей ситуации, как сейчас, для этого я буду использовать наш товар ПОКО класса / таблицу в качестве примера. Таким образом, наше решение API, который вызывается с помощью фронтального применения, имеет 2 проектов, в DAL проект, который вмещает все данные / логику базы данных (свободный API) и сам проект API, который вмещает в себя конечные точки, ViewModels, логика управления пользователями и т.п. Я упростил это как можно больше: Все столы / классы POCO наших собственной базы данных присутствуют в папке OwnModels в то время как модели третьих лиц создаются в папке TheirModels. Их классы POCO воссозданы с спецификацией документа (файла) развязность они должны отправить нам. В нашей базе данных у нас есть несколько таблиц, которые самодельные и другой набор таблиц, которые выступают в качестве справочной таблицы между нашей таблицей базы данных и их таблицей, Товарные один из них. У нас работает процесс, который синхронизирует данные своих баз данных / таблиц собственной базы данных (в воссозданных таблицах). В этом примере они есть таблица TheirCommodity с 3 полями TheirCommodityID, имя и SortOrder. Теперь мы создали справочную таблицу (ПОКО класс) с тем же именем, но без префикса, поэтому Товар. Эта таблица содержит столбец для него» с собственным идентификатором (CommodityID) и опорный идентификатор их таблиц (TheirCommodityID), в Fluent это устанавливаются как отношение один к одному. Большинство из концов справочных таблиц только для чтения (GET конечная точка), просто потому, что нам не разрешено изменять / удалять / добавляемые данные в их таблице непосредственно. В приведенных выше таблицах Сырьевых теперь устанавливается следующим образом: их товар ПОКО класса: класс TheirCommodity общественного {общественного TheirCommodity () {} общественного длинного TheirCommodityID {получить; задавать; } Публичная строка Name {получить; задавать; } Общественность долго? SortOrder {получить; задавать; } [JsonIgnore] публичный виртуальный товар товар {получить; задавать; }} Наш (ссылка) Товарный ПОКО класс: открытый класс товар {общественный товар () {} общественного долго CommodityID {получить; задавать; } Общественность долго TheirCommodityID {получить; задавать; } Общественного виртуального TheirCommodity TheirCommodity {получить; задавать; }} На [JsonIgnore] атрибут добавляется, потому что, если нет, то он попадает в круговой ссылки при получении данных для нашей таблицы ТН (оба класса POCO ссылаться на каждый выдру для получения отношения к один-к-одному сделано прямо в FLUENT). В API я создал GET конечную точку для этого товара следующим образом: [HttpGet] общественность асинхронных задач GetCommodities () {возвращение ждет this.Context.Commodity .INCLUDE (я => i.TheirCommodity) .ToListAsync (); } Вопрос выше все работает нормально, но это огромный хлопот, когда повторно использовать этот код для другой компании, которая имеет другую третью сторону с их набором таблиц и свойств. Эта установка будет означать, нам придется переписать все наши конечные точки и некоторые другие. Так в идеале, по крайней мере, я думаю (но это тоже вопрос), Вы хотели бы получить все свойства своего класса POCO в нашем собственном классе POCO так, что мы не зависит (с Include) на своих классах POCO. Но это также означает, что вам нужно немного логика, что, когда вы получите значения из своих таблиц / свойств, вам нужно написать поле подкладочного или что-то, что запрашивает таблицу третьей стороны. Я не могу полностью обернуть вокруг головы, как это должно быть достигнуто. Я знаю, вы не можете писать совершенно кусок кода, который полностью многоразовый (также, так как мы всегда будем иметь шаг получения таблиц третьей стороной в своей базе данных для синхронизации данных), но, по крайней мере, должна быть что-то не переписывая все наши конечные точки. Мои извинения за большой текст стены, но я не мог найти способ, чтобы написать его короче.
Nicolas
1

голосов
0

ответ
153

Просмотры

Как создать столбец DbGeometry в таблице в C # с помощью Entity Framework Ядро для работы с PostGIS

Я делаю # проект C, где нужно сделать несколько таблиц использовать PostGIS для Рассчитайте расстояния различных объектов. Я создал объект с помощью EntityFramework. Для того чтобы вычислить расстояния, я добавил к объекту широту, долготу и объект Geometry, который использует PostGIS. Тип геометрии Postigis бы в C # типа System.Data.Entity.Spatial.DbGeometry в соответствии с этой документацией: https://www.devart.com/dotconnect/postgresql/docs/DataTypeMapping.html#n3 DbGeometry получается путем добавления EntityFramework (v6.2.0 в моем случае) к нашему проекту. Это код таблицы, которую я хочу создать: используя System.Collections.Generic; используя System.ComponentModel.DataAnnotations; используя System.ComponentModel.DataAnnotations.Schema; используя System.Data.Entity.Spatial; используя System.Drawing; Пространство имен netCore_Proj. Модели {[Table ( "Дом", Schema = "общественность")] общественный класс House: EntityBase {общественный дом () {this.Photos = новый список (); } Публичная строка Title {получить; задавать; } Публичная строка Цена {получить; задавать; } Общественного ИНТ? ZipCode {получить; задавать; } Публичная строка ExteriorColor {получить; задавать; } Публичная строка InteriorColor {получить; задавать; } Публичной виртуальный Список Фотография {получить; задавать; } Публичная строка Описание {получить; задавать; } Публичная строка OwnerName {получить; задавать; } Публичная строка OwnerPhone {получить; задавать; } Публичная строка FullDescription {получить; задавать; } Публичная строка ContactEmail {получить; задавать; } [NotMapped] публичная строка миниатюрное {получить; задавать; } [NotMapped] публичная строка ImagePreview {получить; задавать; } [NotMapped] Публичный список SliderImages {получить; задавать; } [NotMapped] Публичный список MainImages {получить; задавать; } [NotMapped] публичная строка состояния {получить; задавать; } Общественности двойной Lat {получить; задавать; } Общественности двойной Lon {получить; задавать; } Общественного DbGeometry Geom {получить; задавать; }}} Проблема заключается в том, что когда я делаю миграцию, я получаю ошибку говоря: тип объекта «DbGeometry» требует первичный ключ, который будет определен. Вот полное сообщение об ошибке: System.InvalidOperationException: тип объекта «DbGeometry» требует ключа примар у быть определена. на Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNul lPrimaryKeys (IModel модель) в Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate (IMode л модель) в Microsoft. ServiceProvider р rovider) при Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.V isitCallSite (IServiceCallSite callSite, TArgument аргумент) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeReso lver.VisitScoped (ScopedCallSite scopedCallSite, провайдер ServiceProvider) в Microsoft.Extensions.DependencyInjection .ServiceLookup.CallSiteVisitor2.V isitCallSite (IServiceCallSite callSite, TArgument аргумент) на Microsoft.Extensions.DependencyInjection.ServiceProvider.c__DisplayClass 22_0.b__0 (провайдера ServiceProvider) при Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (тип S erviceType) при Microsoft.Extensions .DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService (поставщик IServiceProvider, Тип ServiceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService [Т] (поставщик IServiceProvider) при Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies () в Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider () при Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infr astructure.IInfrastructure.get_Instance () в Microsoft. EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService] (IInfrastructure1 сбруя) на Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateCo NTEXT (Func1 завод) в Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateCo NTEXT (String contextType) в Microsoft .EntityFrameworkCore.Design.Internal.MigrationsOperations. AddMigr ция (имя String, String OutputDir, String contextType) на Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl (Сент имя кольцо, строка OutputDir, String contextType) на Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.c__D isplayClass0_1.b__0 () в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__ DisplayClass3_0`1.b__0 () при Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execu тэ (Действие действия) объект типа «DbGeometry» требует первичный ключ, который будет определен. Может кто-нибудь сказать мне, как я могу решить эту проблему? Обновление автора поста Поскольку DBGeometry и DBGeography объекты не все еще поддерживается Entity рамочных Ядер, я видел в некоторых форумах, что можно использовать пространственные объекты системы. Пространственное OData. Поэтому я заменил объект DBGeometry сущностей рамочного объекта геометрии OData. Но я все еще получаю ту же ошибку: тип объекта «Геометрия» требует первичный ключ, который будет определен. Кто-нибудь пробовал его? Пожалуйста, я буду признателен за любую рекомендацию.
1

голосов
1

ответ
207

Просмотры

Как сделать список из нескольких строк из внутреннего соединения в Entity Framework Ядра?

У меня есть вид модели под названием Pictures, как общественный класс PicturesViewModel {общественного String Name; Публичный список FileNames; } И у меня есть 2 таблицы в базе данных сервера SQL, имена и именах, где idname в FileNames является внешним ключом к идентификатору в именах. Этот скриншот показывает 2 таблицы я использую Entity Framework Ядро в проекте ASP.NET MVC ядра. Я должен использовать базу данных первого метод, и я хочу, чтобы заполнить класс PicturesViewModel в моем контроллере и отправить его к просмотру. Проблема заключается в том, что я не могу найти способ, чтобы создать объект PicturesViewModel из DbContext с LINQ и Entity Framework. Единственный способ, которым я могу рассмотреть, чтобы сделать это с помощью C # (для или Еогеасп) и сделать это с 2 этапа: первый заполнения Имя затем заполнить FileNames с для / Еогеасп цикла Есть еще один способ в Linq или Entity Framework, чтобы создать список из внутреннее соединение в DbContext?
H. Harati
1

голосов
1

ответ
416

Просмотры

How to deal with ASP.NET Core 2.0 Chunked Web Api Call with EF Core

У меня есть Угловое 6 приложение, которое делает вызовы к контроллерам Web API, которые используют EF Core. По умолчанию EF ядро ​​не будет загружать внешние объекты (? Отложенную загрузка может быть), поэтому следующие предложения, я использовал следующий код, чтобы включить такие объекты: члены вара = ждет _context.Person.Include (х => x.PersonNavigation) .гд (х => x.DepartmentId == ID) .ToListAsync (); Проблема заключается в том, когда контроллер возвращает элементы, он посылает заголовок: Transfer-Encoding: Chunked Создание результата / данные нечитаемыми мой угловыми применения (следовало ожидать, я думаю, так как ответ фрагментированное). Какие-либо предложения? Это стандартное поведение Web API? Что я могу сделать, чтобы вернуть жизнеспособный JSON? Спасибо Изменить # 1, за джонни 5 запроса: API управление: общественное асинхронным Task GetDepartmentMembers ([FromRoute] Инт ид) {члены вара = ждет _context.Person. Включить (х => x.PersonNavigation) .гд (х => x.DepartmentId == ID) .ToListAsync (); если (члены == NULL) {вернуться NotFound (); } Возврата OK (пользователей); } Угловая служба: getDepartmentMembers (DepartmentID: число): Наблюдаемое {вернуться this.http.get ( 'HTTP: // локальный: 49659 / API / отделов /' + DepartmentID + '/') членов; } Угловой компонент: getDepartmentMembers (DepartmentID: число) {this.departmentService.getDepartmentMembers (DepartmentID) .subscribe (данные => {this.departmentMembers = данные;}); } Заголовки ответов: 49659 / API / отделов /»+ DepartmentID + '/') членов; } Угловой компонент: getDepartmentMembers (DepartmentID: число) {this.departmentService.getDepartmentMembers (DepartmentID) .subscribe (данные => {this.departmentMembers = данные;}); } Заголовки ответов: 49659 / API / отделов /»+ DepartmentID + '/') членов; } Угловой компонент: getDepartmentMembers (DepartmentID: число) {this.departmentService.getDepartmentMembers (DepartmentID) .subscribe (данные => {this.departmentMembers = данные;}); } Заголовки ответов:
Naner
1

голосов
0

ответ
182

Просмотры

Entity Framework Ядро 2.1 - Получение StackOverflowException при выполнении запросов с большим количеством столбцов

Поскольку обновление для Entity Framework Ядро 2.1 (в настоящее время на 2.1.1), я столкнулся ряд запросов, которые в настоящее время бросают StackOverflowException. Эти запросы работали в v2.0.x. Это только на больших запросов - 50 + столбцов. Большинство запросов не является сложным - они все один оператором выбора с 10-15 присоединяются и фильтр или 2. Необработанное исключение типа «System.StackOverflowException» произошло в Microsoft.EntityFrameworkCore.Relational.dll Это все, что я получить. Я не могу получить любой трассировки стека или другую полезную информацию. У меня есть DebugLoggerProvider настроить на DbContext и, кажется, что запрос составлен и выполнен прекрасно: Microsoft.EntityFrameworkCore.Database.Command: Информация: (DbCommand, в совершении 162ms) [Параметры = [@__ ID_0 = «1»], CommandType = 'Текст', CommandTimeout = '30' ] Есть ли какой-то вопрос материализация? Объект Я проецирование в не имеет самостоятельной ссылки, только простые свойств. Я могу работать точно такой же запрос прекрасно в LINQPad. Я вижу только StackOverflowException при работе в моем веб-сайте ASP.NET MVC (не ядро). Я могу закомментировать кусок проекций собственности и получить запрос на работу, но свойства, кажется, не имеет значения. Это как если есть некоторый предел столбца, но он отлично работает в LINQPad и прекрасно работал раньше. Любые идеи о том, что происходит или даже, как я мог бы получить более подробную информацию? Я могу закомментировать кусок проекций собственности и получить запрос на работу, но свойства, кажется, не имеет значения. Это как если есть некоторый предел столбца, но он отлично работает в LINQPad и прекрасно работал раньше. Любые идеи о том, что происходит или даже, как я мог бы получить более подробную информацию? Я могу закомментировать кусок проекций собственности и получить запрос на работу, но свойства, кажется, не имеет значения. Это как если есть некоторый предел столбца, но он отлично работает в LINQPad и прекрасно работал раньше. Любые идеи о том, что происходит или даже, как я мог бы получить более подробную информацию?
Adam
1

голосов
1

ответ
366

Просмотры

Entity Framework ядра назначить ограничение внешнего ключа в OnModelCreating?

Я пытаюсь понять, как программно генерировать свою базу данных с помощью Entity Framework Ядро, и я бегу в проблемы, присваивающих внешний ключ к полю в таблице. Мне нужно поле Адрес для ссылки на объект адреса и загрузить его, когда я иду, чтобы получить запись из базы данных. Если я создаю базу данных с помощью EnsureCreated, он создает таблицы правильно за исключением того, что поле AddressID не является внешним ключом к таблице адресов. Я пытался делать свое исследование по этому вопросу, и побежал в эту статью, в которой используется метод, называемый HasForeignKey, однако все, что возвращается из Entity () не знает о HasForeignKey. Я получаю эту ошибку, если я пытаюсь вручную ввести его в я получаю: Ошибка CS1061 «EntityTypeBuilder» не содержит определения для «HasForeignKey», а метод расширения «HasForeignKey» принимая первый аргумент типа «EntityTypeBuilder» может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?) Так, очевидно, что такой подход не является действительным. Я попытался после этой документации, но я не очень понимаю, что он делает и как применить его к моей ситуации. В их случае у них есть пара таблиц, блог и сообщения, где блог имеет много постов и пост имеет блог. Я попытался следующие вдоль лучшее, что я мог бы, но я не очень понимаю все жаргон и что это достижения. Как я могу идти о просто назначая значение, найденное в AddressID в качестве внешнего ключа для записи в адресах? Это код, я использую. общественный класс Person {[Key] публичное ИНТ Id {получить; задавать; } Публичная строка FirstName {получить; задавать; } Публичная строка LastName {получить; задавать; } Общественный байт Возраст {получить; задавать; } Общественного ИНТ AddressID {получить; задавать; } Общественности Адрес Адрес {получить; задавать; }} Общественного класса Address {[Key] общественное ИНТ Id {получить; задавать; } Публичная строка Street {получить; задавать; } Публичная строка Город {получить; задавать; } Строка Государственной публичной {получить; задавать; } Публичная строка ZipCode {получить; задавать; }} Общественного класса MyContext: DbContext {публика DbSet Люди {получить; задавать; } общественного DbSet адреса {получить; задавать; } Защищен переопределения недействительным OnConfiguring (DbContextOptionsBuilder optionsBuilder) {optionsBuilder.UseSqlite ($ "Источник данных = test.db"); } Защищен переопределение недействительный OnModelCreating (ModelBuilder строитель) {base.OnModelCreating (строитель); builder.Entity (). HasKey (v => v.Id); . Builder.Entity () HasKey (v => v.Id); }} Класс Program {статической силы Main (string [] арг) {используя (вар дб = новая MyContext ()) {// вар человек = db.People.Find (1); db.Database.EnsureCreated (); вар человек = новый Person () {FirstName = "Джек", LastName = "Джексон", Age = 50, адрес = новый адрес () {Street = "123 Street St", Город = "Джексонвилл", State = "Миссисипи" , ZipCode = "00000-0000"}}; db.People.Add (человек); db.SaveChanges (); }}} Немного дополнительной информация: Я использую .Net 2.0 Core, мою базу данных является SQLite Я использую библиотеку Microsoft.EntityFrameworkCore.SQLite & SQLite.Core для моего провайдера.
Zulukas
1

голосов
0

ответ
196

Просмотры

EF Ядро 2,1 дискриминированных Тип С МНОГИХ> Многие коллекции

У меня есть модель, которая примерно по следующим направлениям: Выражение ExpressionGroup - Выражения (полиморфную коллекция с помощью базового типа, который либо выражение или ExpressionGroup) ^ достигается с помощью базового класса, который сконфигурирован с дискриминатором колонка (перечислением) Система Я работаю над требую следующего: выражения и группа однозначно идентифицируемые, а также должен быть общих объекты (например, несколько групп могут ссылаться на то же выражение и ту же группу) Я такая конфигурацию настроить, с HasMany (группа => group.Expressions) .WithOne () конфигурации, потому что это тот случай, когда группа может иметь множество компонентов выражения (базовый тип), но нет никакого смысла навигации собственности в обратном направлении. Это привело к колонке на каждом компоненте, который отслеживает, к какой группе принадлежит, и когда я добавить новую группу, ссылающийся существующее выражение, предыдущая группа, которая ссылается она теряет эту ссылку, и новый один берет на себя. Мне нужно, чтобы быть в состоянии иметь несколько групп ссылаться на то же выражение (или группы / с), но нет никаких причин для домена происходит от выражения к группе. Будет ли правильный способ обойти это просто ввести свойство коллекции нав против выражения ссылки на группу (/ с) он принадлежит? Или есть некоторые странные изменения ManyMany мне нужно ввести? Ниже конфигурация сущности этих типов. аннулированию IEntityTypeConfiguration.Configure (EntityTypeBuilder строитель) {builder.ToTable ( "ExpressionComponents"); builder.HasDiscriminator (е => e.Type) .HasValue (DTO.Topics.Blocks.MetaBlockExpressionType.Expression) .HasValue (DTO.Topics.Blocks. MetaBlockExpressionType.Group); builder.Property (е => e.Token) .IsRequired (); builder.Property (е => e.Type) .IsRequired (); builder.HasIndex (е => e.Token) .IsUnique (истина); } Недействительный IEntityTypeConfiguration.Configure (EntityTypeBuilder строитель) {builder.Property (е => e.FacetId) .IsRequired (); builder.Property (е => e.Operation) .IsRequired (); builder.Property (е => e.Values) .IsRequired () .HasConversion (Vals => CSVUtilities.ToCsvStringList (Vals), ул => CSVUtilities.FromCsvStringList (ул) .ToArray ()); } Недействительный IEntityTypeConfiguration.Configure (EntityTypeBuilder строитель) {builder.Property (г => g.Operator) .IsRequired (); строитель .HasMany (г => g.Expressions) .WithOne ();
Clint
1

голосов
2

ответ
136

Просмотры

Entity Framework 6 - база данных высева бросает System.NullReferenceException

Я использую .net 2 ядра и entityframework 6.2. Я пытаюсь семена базы данных с некоторыми необходимыми базовыми данными. Я не нашел метод Database.SetInitializer. Поэтому я гугл и нашел еще один способ потомству своей базы данных в главном методе класса Program (как показано ниже). Я использовал ниже код, чтобы семя своей базы данных, но при выполнении метода SaveChange из DbContext, всегда я получаю ошибку NullReferenceException. Я использую те же базу данных, как использует идентичность. Имеет ли это влияет на результат? Класс программы: Программа общественного класса {государственной статической силы Main (string [] арг) {// BuildWebHost (арг) .run (); вар хост = BuildWebHost (арг); используя (вар сфера = host.Services.CreateScope ()) {вар услуги = scope.ServiceProvider; попробуйте {уаг контекст = services.GetRequiredService (); context.Provinces.Add (новый Models.Province {ID = 1, Name = "TEST"}); context.SaveChanges (); // WebHost.CreateDefaultBuilder (арг) .UseStartup () .build (); } Исключение: Сообщение: «Ссылка на объект не указывает на экземпляр объекта.» Источник: "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" StackTrace: в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver.OnNext (KeyValuePair`2 KeyValuePair) в System.Diagnostics.DiagnosticListener.Write (имя String, значение объекта) при диагностике Microsoft.EntityFrameworkCore.Internal.CoreLoggerExtensions.SaveChangesFailed (IDiagnosticsLogger`1, DbContext контекст, Исключение Исключение) при Microsoft.EntityFrameworkCore.DbContext.SaveChanges (Boolean acceptAllChangesOnSuccess) на Microsoft.EntityFrameworkCore.DbContext.SaveChanges () в Invitation.Program.Main (String [] арг) в D: \ Проекты \ \ Приглашение Приглашение \ Program.cs : строка 29 InnerException: нулевой класс запуска: общественный класс запуск {запуск (конфигурация наследует IConfiguration) публичного {конфигурации = конфигурация; } Конфигурация общественного {наследуют IConfiguration получить; } общественного недействительными ConfigureServices (услуги IServiceCollection) {services.AddDbContext (опции => options.UseSqlServer (Configuration.GetConnectionString ( "DefaultConnection"))); services.AddCustomIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders (); services.AddTransient (); services.ConfigureCustomApplicationCookie (); services.AddAntiforgery (опции => options.HeaderName = "X-XSRF-ЗНАК"); services.AddMvc () .AddRazorPagesOptions (опции => {options.Conventions.AuthorizeFolder ( "/ Account / Управление"); options.Conventions.AuthorizePage ( "/ счета / Выход");}); Соединение вар = Configuration.GetConnectionString ( "DefaultConnection"); services.AddDbContext (опции => options.UseSqlServer (подключение)); services.AddSingleton (); } Общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment ENV) {если (env.IsDevelopment ()) {app.UseBrowserLink (); app.UseDeveloperExceptionPage (); приложение. UseDatabaseErrorPage (); } Еще {app.UseExceptionHandler ( "/ Ошибка"); } App.UseStaticFiles (); app.UseAuthentication (); app.UseMvc (); }} ApplicationDbContext класс: класс ApplicationDbContext общественности: IdentityDbContext {общественного ApplicationDbContext (варианты DbContextOptions): базовая (опция) {} защищен переопределение недействительного OnModelCreating (ModelBuilder строитель) {base.OnModelCreating (строитель); } общественного DbSet Провинция {получить; задавать; }} BW Я использую EntityFramework 6.2.0 & Microsoft.EntityFrameworkCore.Tools 2.1.1 (может быть полезной информацией) Спасибо за тратить время. UseAuthentication (); app.UseMvc (); }} ApplicationDbContext класс: класс ApplicationDbContext общественности: IdentityDbContext {общественного ApplicationDbContext (варианты DbContextOptions): базовая (опция) {} защищен переопределение недействительного OnModelCreating (ModelBuilder строитель) {base.OnModelCreating (строитель); } общественного DbSet Провинция {получить; задавать; }} BW Я использую EntityFramework 6.2.0 & Microsoft.EntityFrameworkCore.Tools 2.1.1 (может быть полезной информацией) Спасибо за тратить время. UseAuthentication (); app.UseMvc (); }} ApplicationDbContext класс: класс ApplicationDbContext общественности: IdentityDbContext {общественного ApplicationDbContext (варианты DbContextOptions): базовая (опция) {} защищен переопределение недействительного OnModelCreating (ModelBuilder строитель) {base.OnModelCreating (строитель); } общественного DbSet Провинция {получить; задавать; }} BW Я использую EntityFramework 6.2.0 & Microsoft.EntityFrameworkCore.Tools 2.1.1 (может быть полезной информацией) Спасибо за тратить время. OnModelCreating (строитель); } общественного DbSet Провинция {получить; задавать; }} BW Я использую EntityFramework 6.2.0 & Microsoft.EntityFrameworkCore.Tools 2.1.1 (может быть полезной информацией) Спасибо за тратить время. OnModelCreating (строитель); } общественного DbSet Провинция {получить; задавать; }} BW Я использую EntityFramework 6.2.0 & Microsoft.EntityFrameworkCore.Tools 2.1.1 (может быть полезной информацией) Спасибо за тратить время.
Amin
1

голосов
1

ответ
40

Просмотры

Сохранение Ссылки на несколько объектов в другом ограниченном контексте, используя каркасный объект ядро-

Я пытаюсь дизайном управляемого домена и я использую Entity Framework ядро. Из моего понимания дизайна ведомого домена я никогда не должен ссылаться на объекты в другом ограниченном контексте, я могу ссылаться только их идентификаторы. У меня есть класс А в ограниченном контексте А, ссылается на множество объектов типа В в ограниченном контексте В, как показано ниже были должны хранить только ссылки на идентификаторы объектов B. общественного класса А {общественного ИНТ Id {получить; частный набор; } Публичный список СТАВКИ {получить; частный набор; } Общественного ИНТ Имя {получить; частный набор; }} Общественного класса B {общественного ИНТ Id {получить; частный набор; } Общественного ИНТ Имя {получить; частный набор; }} Как описать эту конфигурацию отношений в Fluent API? Если я не добавить любую конфигурацию, то я получаю ошибку свойство «„A.bIds“имеет тип„List“ который не поддерживается текущим поставщиком базы данных. ". Спасибо
Eoghan
1

голосов
1

ответ
86

Просмотры

Entity Framework Core Code First changing added entities values before save causes identity insert error

У меня проблема с установкой значения перед сохранением добавляемых лиц. Когда я не меняю сущность ценности она сохраняет без проблем. Ошибки я получаю это: SqlException: Невозможно вставить явное значение для столбца идентификаторов в таблице «TableName», когда IDENTITY_INSERT установлен в положение OFF. Я использую .net 2.1 Сердечник и мои NuGet пакеты все в актуальном состоянии. Приведенный ниже код работает отлично в Entity Framework для .NET Framework общественного переопределение Int SaveChanges () {попробуйте {INT USERID = currentUser.UserId; IEnumerable addedEntities = ChangeTracker.Entries () .где (е => e.State == EntityState.Added && e.CurrentValues.ToObject () является ModelBase) .Select (е => е); Еогеасп (вар е в addedEntities) {вар CLE = e.CurrentValues.ToObject (), как ModelBase; если (CLE! = NULL) {clE.CreatedOn = DateTime.Now; clE.CreatedBy = идентификатор пользователя; } // Когда я удаляю эту строку, она работает без проблем // но она не устанавливает значения, очевидно, e.CurrentValues.SetValues ​​(CLE); } Вернуть base.SaveChanges (); } Задвижка (Исключение dbEx) {Исключение поднимают = dbEx; бросить рейз; }} Любая идея, что я делаю неправильно? Благодаря Chris Сохранить изменения(); } Задвижка (Исключение dbEx) {Исключение поднимают = dbEx; бросить рейз; }} Любая идея, что я делаю неправильно? Благодаря Chris Сохранить изменения(); } Задвижка (Исключение dbEx) {Исключение поднимают = dbEx; бросить рейз; }} Любая идея, что я делаю неправильно? Благодаря Chris
Chris
1

голосов
2

ответ
375

Просмотры

LINQ не производит COUNT () запрос на группы с помощью EF Сердечник

У меня есть приложение ASP.N Co, который работает на SQL Server 2012 с помощью EF Core. Что я хочу достигнуть, считая размер различных групп, как из Ь в this._context.Benchmark группы б по b.Device в г выбрать новый {Device = g.Key, Count = g.Count ()} Проблема заключается в том, что все это происходит крайне медленно, и причина, что, кажется, что SQL заявление не сопоставляется с GROUP BY и COUNT (*), но в соответствии с отладчиком, приложение запрашивает все и выполняет подсчет на CPU. Запрос я получаю из окна событий отладчика выглядит следующим образом: SELECT [b0] [ID], [b0] [CreateDate], [b0] [Творец], [b0] [устройство], [b0] [..... Окружающая среда], [b0]. [машина], [b0]. [Имя], [b0]. [Plugin], [b0]. [RunDate] FROM [Benchmark] AS [b0] ORDER BY [b0]. [Устройство] можно также видеть, что потребление памяти Экспресса IIS я использую для отладки безумно для простого COUNT (), так что я склонен верить, что это фактический запрос. Возникает вопрос: как я могу перефразировать запрос таким образом, что он на самом деле отображает на COUNT ()? Изменить: Я попробовал тот же самый запрос на «реальном» EF и ctx.Database.Log = Console.Write, который производит ожидаемый COUNT () запрос, который заставляет меня поверить, что это вопрос EF Core.
Christoph
1

голосов
0

ответ
42

Просмотры

Материализовать частичный набор результатов с EF Ядра 2.1

Скажем, у меня есть большой набор задач, хранящихся в БД, и я хочу, чтобы получить последний один в соответствии с просьбой разрешения пользователя. Разрешениями проверки логика является сложной и не связан с сохранением слоя, поэтому я не могу поставить его в запросе SQL. То, что я делаю сегодня извлечения всех задач из БД упорядоченные по дате по убыванию, а затем фильтровать их по разрешений, установленных и принимая первый. Не идеальное решение: я получить тысячи объектов, когда мне нужно только одно. Мой вопрос: как я могу материализовать предметы, поступающие из БД, пока не найдете тот, который соответствует моим критериям и сброшенные отдыха результатов? Я думал об одно решение, но не смог найти информацию о поведении EF ядра в этом случае и не знаю, как проверить это сам: Построить IQueryable, литая в IEnumerable, затем перебрать и возьмите первую хорошую задачу. Я знаю, что IQueryable часть будет выполняться на сервере и IEnumerable на клиенте, но я не знаю, если все задачи будут материализовался перед наклеиванием FilterByPermissions или она будет выполняться по требованию? И я тоже не люблю синхронный характер этого решения. IQueryable allTasksQuery = ...; IEnumerable allTasksEnumerable = allTasksQuery.AsEnumerable (); IEnumerable filteredTasks = FilterByPermissions (allTasksEnumerable); MyTask latestTask = filteredTasks.FirstOrDefault (); Обходной путь может быть не получение небольших наборов данных (страницы 50, например), пока одна хорошая задача найдена, но я не люблю его. знаешь, если все задачи будут материализовались перед применением FilterByPermissions или будет выполняться по требованию? И я тоже не люблю синхронный характер этого решения. IQueryable allTasksQuery = ...; IEnumerable allTasksEnumerable = allTasksQuery.AsEnumerable (); IEnumerable filteredTasks = FilterByPermissions (allTasksEnumerable); MyTask latestTask = filteredTasks.FirstOrDefault (); Обходной путь может быть не получение небольших наборов данных (страницы 50, например), пока одна хорошая задача найдена, но я не люблю его. знаешь, если все задачи будут материализовались перед применением FilterByPermissions или будет выполняться по требованию? И я тоже не люблю синхронный характер этого решения. IQueryable allTasksQuery = ...; IEnumerable allTasksEnumerable = allTasksQuery.AsEnumerable (); IEnumerable filteredTasks = FilterByPermissions (allTasksEnumerable); MyTask latestTask = filteredTasks.FirstOrDefault (); Обходной путь может быть не получение небольших наборов данных (страницы 50, например), пока одна хорошая задача найдена, но я не люблю его. MyTask latestTask = filteredTasks.FirstOrDefault (); Обходной путь может быть не получение небольших наборов данных (страницы 50, например), пока одна хорошая задача найдена, но я не люблю его. MyTask latestTask = filteredTasks.FirstOrDefault (); Обходной путь может быть не получение небольших наборов данных (страницы 50, например), пока одна хорошая задача найдена, но я не люблю его.
Artur

Просмотр дополнительных вопросов