Допустим, у меня есть 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 или мне нужно вручную проверять перед вставкой
Это можно сделать с помощью триггеров.
Почему бы не хранить их в одной таблице? SaleAddress
можно легко всегда Active
и иметь Index = null
. Просто добавьте поле типа, но даже не обязательно использовать наследование TPH, хотя можно было бы. Тогда вы можете просто сделать поле Address
уникальным с помощью индекса.
@GertArnold Извините, большинство свойств в объекте я пропустил, мне нужно хранить их отдельно из-за других связей (других таблиц).
@AlexanderPetrov, не могли бы вы подсказать мне, как это сделать?
Тем не менее, я думаю, вам нужно создать одну таблицу, содержащую ту часть, которая должна быть уникальной. Похоже, вам нужен один из шаблонов наследования, поддерживаемых EF.
Найдите «триггеры sql для двух таблиц». Чтобы дать более конкретное решение, нам нужно знать, какую СУБД вы используете. Но в любом случае решение на основе триггеров довольно плохое, поскольку оно громоздкое и будет неэффективным по производительности. На вашем месте я бы прислушался к совету Герта Арнольда.
Дочерние типы в TPH могут иметь переходы к другим таблицам. EF Core создаст соединения sql с фильтром дискриминатора. Столбцы внешнего ключа будут иметь значение NULL. Уникальные индексы Sql Server также могут иметь фильтры.
Я не думаю, что базы данных SQL допускают такую связь, но даже если это каким-то образом достигается, вставка таблиц теперь не удастся, потому что она уже есть в другой таблице, поэтому вам все равно нужно проверить, существуют ли данные, прежде чем вставлять.
Две идеи, которые я могу предложить:
Ваша проблема больше связана с бизнес-логикой, чем с логикой данных, и написание бизнес-логики в вашей программе вполне нормально.
Если оба адреса являются адресами и вам фактически не нужно их разделять, просто создайте таблицу адресов и добавьте поле для указания типа адреса. Затем вы можете применить уникальный индекс к этой таблице, что упростит задачу.
таблица адресов, вероятно, лучшее решение и самое простое для меня решение для банкомата, простое и эффективное
Здесь происходит несколько вещей. Во-первых, я думаю, что, поскольку ваш объект «Адрес продаж» использует GUIDS для обеспечения уникальности, нет никаких ограничений, чтобы сказать, что имена также известны. Адрес строки типа должен быть уникальным. Возможно, вы могли бы украсить адрес чем-то вроде этого: [Index(IsUnique = true)] Ссылка: stackoverflow.com/questions/52222577/…