Уникальное ограничение ef core для двух разных объектов

Допустим, у меня есть 2 объекта, между ними нет связи. Я хотел убедиться, что в базе данных у меня есть уникальные адреса, поэтому я попробовал следующее

public class SaleAddress : SaveConfig
        {
            [Key]
            [Required]
            public Guid SaleAddressId { get; set; }
            public Guid SignatureId { get; set; }
            public string Address { get; set; }
        }
    
        public class DepositAddress : SaveConfig
        {
    
            [Key]
            [Required]
            public Guid DepositAddressId { get; set; }
            public int? Index { get; set; }  
            public bool Active { get; set; }
            public Guid SignatureId { get; set; }
            public string Address { get; set; }
        }

Я создал ограничение для уникального адреса

modelBuilder.Entity<SaleAddress>()
             .HasIndex(e => e.Address)
             .IsUnique();

         // Ensure Address is unique no duplicated address
         modelBuilder.Entity<DepositAddress>()
             .HasIndex(e => e.Address)
             .IsUnique();

Можно ли также предотвратить использование одного и того же адреса (saleaddress) в таблице депозитных адресов и наоборот, или мне нужно вручную проверять перед вставкой

Пример. Допустим, я хочу вставить новые адреса депозитов.

var depositAddress = new DepositAddress
        {
            Address = "Foo"
        };
 await _repository.DepositAddressesRepository.Add(depositAddress);


var depositAddress = new DepositAddress
        {
            Address = "Foo1"
        };
 await _repository.DepositAddressesRepository.Add(depositAddress);
     await _repository.SaveAsync();   

//выше будет проходить через "Foo" и "Foo1" уникальны

// следующее должно вызвать исключение, поскольку в адресе депозита уже есть «Foo1»

var saleAddress = new SaleAddress
        {
            Address = "Foo1"
        };
 await _repository.SaleAddressesRepository.Add(saleAddress);
     await _repository.SaveAsync();

можно ли это как-то настроить в efcore или мне нужно вручную проверять перед вставкой

Здесь происходит несколько вещей. Во-первых, я думаю, что, поскольку ваш объект «Адрес продаж» использует GUIDS для обеспечения уникальности, нет никаких ограничений, чтобы сказать, что имена также известны. Адрес строки типа должен быть уникальным. Возможно, вы могли бы украсить адрес чем-то вроде этого: [Index(IsUnique = true)] Ссылка: stackoverflow.com/questions/52222577/…

Craig Gers 25.06.2024 11:32

Это можно сделать с помощью триггеров.

Alexander Petrov 25.06.2024 12:19

Почему бы не хранить их в одной таблице? SaleAddress можно легко всегда Active и иметь Index = null. Просто добавьте поле типа, но даже не обязательно использовать наследование TPH, хотя можно было бы. Тогда вы можете просто сделать поле Address уникальным с помощью индекса.

Gert Arnold 25.06.2024 20:37

@GertArnold Извините, большинство свойств в объекте я пропустил, мне нужно хранить их отдельно из-за других связей (других таблиц).

Vladimir 25.06.2024 20:51

@AlexanderPetrov, не могли бы вы подсказать мне, как это сделать?

Vladimir 25.06.2024 20:52

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

Gert Arnold 25.06.2024 21:10

Найдите «триггеры sql для двух таблиц». Чтобы дать более конкретное решение, нам нужно знать, какую СУБД вы используете. Но в любом случае решение на основе триггеров довольно плохое, поскольку оно громоздкое и будет неэффективным по производительности. На вашем месте я бы прислушался к совету Герта Арнольда.

Alexander Petrov 25.06.2024 21:16

Дочерние типы в TPH могут иметь переходы к другим таблицам. EF Core создаст соединения sql с фильтром дискриминатора. Столбцы внешнего ключа будут иметь значение NULL. Уникальные индексы Sql Server также могут иметь фильтры.

Jeremy Lakeman 26.06.2024 06:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что базы данных SQL допускают такую ​​связь, но даже если это каким-то образом достигается, вставка таблиц теперь не удастся, потому что она уже есть в другой таблице, поэтому вам все равно нужно проверить, существуют ли данные, прежде чем вставлять.

Две идеи, которые я могу предложить:

1. Проверьте перед вставкой


Ваша проблема больше связана с бизнес-логикой, чем с логикой данных, и написание бизнес-логики в вашей программе вполне нормально.

2. Объедините таблицы


Если оба адреса являются адресами и вам фактически не нужно их разделять, просто создайте таблицу адресов и добавьте поле для указания типа адреса. Затем вы можете применить уникальный индекс к этой таблице, что упростит задачу.

таблица адресов, вероятно, лучшее решение и самое простое для меня решение для банкомата, простое и эффективное

Vladimir 30.06.2024 12:47

Другие вопросы по теме