Я создаю POST API для вставки данных в мою таблицу Walks, и у него есть две таблицы ForeignKey с трудностями и регионами, и это моя модель Walk.
public class Walk
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double LengthInKm { get; set; }
public string? WalkImageUrl { get; set; }
public Guid DifficultyId { get; set; }
public Guid RegionId { get; set; }
public Difficulty Difficulty { get; set; }
public Region Region { get; set; }
}
Я не знаю, почему происходит конфликт, потому что я проверил всю таблицу и модель. Я засеял данные в разделе «Регионы и сложность», но они все еще не работают.
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Difficulty> Difficulties { get; set; }
public DbSet<Region> Regions { get; set; }
public DbSet<Walk> Walks { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var difficuties = new List<Difficulty>()
{
new Difficulty()
{
Id = Guid.Parse("ce6a68d1-b490-4d38-a162-21ce3c371bfa"),
Name = "Easy"
},
new Difficulty()
{
Id = Guid.Parse("f5a9b531-a099-493a-a05a-81c95627adbc"),
Name = "Medium"
},
new Difficulty()
{
Id = Guid.Parse("261f60b6-efa7-426d-8ea4-7b34cf9beba1"),
Name = "Hard"
}
};
modelBuilder.Entity<Difficulty>().HasData(difficuties);
var regions = new List<Region>()
{
new Region
{
Id = Guid.Parse("3a5d1dd2-abc5-412b-9e3d-c1b2648a228f"),
Name = "Ha Noi",
Code = "HN",
RegionImageUrl = ""
},
new Region
{
Id = Guid.Parse("22715dff-abad-4263-837a-9e97d80fa86d"),
Name = "Sai Gon",
Code = "SG",
RegionImageUrl = ""
},
new Region
{
Id = Guid.Parse("bc562c11-d7b2-478b-a75d-56a8da71b85a"),
Name = "Da Nang",
Code = "DN",
RegionImageUrl = ""
},
new Region
{
Id = Guid.Parse("76675766-473f-4d1d-aba3-e4673f805d0c"),
Name = "Ninh Binh",
Code = "NB",
RegionImageUrl = ""
}
};
modelBuilder.Entity<Region>().HasData(regions);
}
}
Это мой контекст базы данных, в который я заполнил некоторые данные.
Это мой контроллер
private readonly IMapper mapper;
private readonly IWalkRepository walkRepository;
public WalksController(IMapper mapper, IWalkRepository walkRepository)
{
this.mapper = mapper;
this.walkRepository = walkRepository;
}
[HttpPost]
public async Task<IActionResult> Create([FromBody] CreateAndUpdateWalkDTO createAndUpdateWalkDTO)
{
// map from createDTO to model
var createWalkModel = mapper.Map<Walk>(createAndUpdateWalkDTO);
await walkRepository.CreateAsync(createWalkModel);
//map from model to dto to return
return Ok(mapper.Map<WalkDTO>(createWalkModel));
}
Создание и обновление DTO
public class CreateAndUpdateWalkDTO
{
public string Name { get; set; }
public string Description { get; set; }
public double LengthInKm { get; set; }
public string? WalkImageUrl { get; set; }
public Guid DiffcultyId { get; set; }
public Guid RegionId { get; set; }
}
Прогулка по DTO
public class WalkDTO
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double LengthInKm { get; set; }
public string? WalkImageUrl { get; set; }
public Guid DiffcultyId { get; set; }
public Guid RegionId { get; set; }
}
Мой объект, который я отправляю от клиента
{
"name": "Name",
"description": "This is description",
"lengthInKm": 10,
"walkImageUrl": null,
"diffcultyId": "f5a9b531-a099-493a-a05a-81c95627adbc",
"regionId": "3a5d1dd2-abc5-412b-9e3d-c1b2648a228f"
}
мне очень жаль, я отредактировал свое сообщение, сэр
Я могу ошибаться, но подозреваю, что это потому, что вы используете код для генерации идентификаторов, а не констант. Я видел нечто подобное, используя DateTime.Now, хотя на самом деле это значение каждый раз было разным, возможно, это не одно и то же. Не знаю, как это обойти для значений GUID.
Действительно ли имеет смысл использовать GUID для этих идентификаторов? Возможно, это то, что вы не можете изменить сейчас, но обычно вам следует использовать GUID только в том случае, если идентификаторы генерируются в нескольких разных системах. Вероятность дублирования GUID очень мала даже в этом сценарии, тогда как целым числам потребуется назначать разные диапазоны для сохранения уникальности. Однако использование GUID неэффективно, поэтому, если вы генерируете ключи только в одной системе, особенно если это жестко закодированные данные, которые не будут добавлены позже, вам действительно следует использовать целочисленные идентификаторы.
потому что это не константы, поэтому мне нужно жестко закодировать идентификатор и проанализировать его в Guid. Когда я позвонил API, я скопировал два FK из базы данных.
Как вы думаете, мне следует использовать другой тип идентификатора, например Int?
Позвольте мне попробовать, и я оставлю отзыв позже! Спасибо, сэр
Независимо от этой проблемы, вы всегда должны использовать целочисленный тип данных для вашего ПК, если это возможно. Как я уже сказал, GUID гораздо менее эффективны, поэтому их следует использовать только в случае необходимости. Могут быть и другие причины, но наиболее распространенной причиной использования GUID в качестве ПК является их создание на нескольких клиентских системах, а не на одном сервере.
Если вы собираетесь придерживаться GUID, это настоящий удар в темноту, но попробуйте использовать конструктор Guid вместо Guid.Parse.
Ошибка ясно указывает на то, что используемый FK не является значением в поле первичного ключа внешней таблицы. Убедились ли вы, что ваша таблица заполняется так, как ожидалось в соответствии с вашим методом заполнения?
@jmcilhinney - по сути нет никакой разницы между конструктором и методом статического анализа. stackoverflow.com/questions/6915966/…
Я проверил все данные в двух таблицах с двумя засеянными данными, и они оправдали мои ожидания.
@StephenWrighton, я думал, что это так, но хватался за соломинку. Как оказалось, я на самом деле неправильно прочитал вопрос и пытался решить не ту задачу. Ваш первый комментарий заставил меня осознать свою ошибку.
@PhạmTrọngNghĩa, прошу прощения, но я совершенно неправильно понял проблему, поэтому, хотя вам все равно следует изменить тип данных идентификатора, если это возможно, все остальное, что я сказал, не имеет значения. Я думал, что проблема заключалась в вставке исходных данных, но, похоже, на самом деле проблема связана с вставкой данных, связанных с этими исходными записями. На самом деле вы не показали нам, где вы пытаетесь выполнить вставку, которая не удалась, поэтому мы не можем понять, что с ней не так. Я предлагаю вам написать тестовый код с жестко запрограммированными значениями FK, скопированными из этих исходных данных.
@jmcilhinney, нет проблем, я очень благодарен, что ты мне помогаешь. Это мой объект, который я отправляю от клиента для создания: ``` { "name": "имя примера", "description": "это описание", "lengthInKm": 10, "walkImageUrl": null, "diffcultyId" : "ce6a68d1-b490-4d38-a162-21ce3c371bfa", "regionId": "22715dff-abad-4263-837a-9e97d80fa86d" } ```
и это мой контроллер ` [HttpPost] public async Task<IActionResult> Create([FromBody] CreateAndUpdateWalkDTO createAndUpdateWalkDTO) { // сопоставляем из createDTO с моделью var createWalkModel = mapper.Map<Walk>(createAndUpdateWalkDTO); ждут walkRepository.CreateAsync(createWalkModel); // сопоставляем модель с dto, чтобы вернуть return Ok(mapper.Map<WalkDTO>(createWalkModel)); } `извините, я не знаю, как создать поле кода в комментарии :(
это мой исходный код github.com/phamnghiascode/Nghia
Не публикуйте код в комментариях или ссылках на код. Пожалуйста, отредактируйте свой вопрос и предоставьте там всю необходимую информацию. В отличие от форума, где сообщения обычно не следует редактировать, если они не содержат ошибок, вопросы SO следует редактировать, если требуется новая информация. Вопрос всегда должен быть источником истины. Никто не должен читать комментарии, чтобы понять вопрос.
@jmcilhinney извините, сэр, я отредактировал свой вопрос и добавил еще немного кода





После многих дней попыток я понял, что моя глупость возникла из-за того, что я создал и отправил не тот объект. Это неправильный объект
{
"name": "Name",
"description": "This is description",
"lengthInKm": 10,
"walkImageUrl": null,
"diffcultyId": "f5a9b531-a099-493a-a05a-81c95627adbc",
"regionId": "3a5d1dd2-abc5-412b-9e3d-c1b2648a228f"
}
и проблема в орфографической ошибке «diffcultyId». Это должен быть «diffcultyId»
Пожалуйста, не публикуйте изображения кода. Вы правильно опубликовали первый фрагмент кода, поэтому я не уверен, почему вы не разместили правильно и второй.