Я уверен, что если вы посмотрите на запись в базе данных, она покажет пустой guid (только нули).Чтобы «исправить» проблему, вам нужно сгенерировать guid и добавить его в свой класс Id.Самый простой способ исправить это - добавить конструктор по умолчанию и добавить Id = Guid.NewGuid();
таким образом, чтобы у ваших классов был собственный guid, и все должно работать как положено.
РЕДАКТИРОВАТЬ: так как оно GroupType
, которое сохраняетсядля базы данных несколько раз с одним и тем же guid есть два сценария, о которых я могу подумать.1) Вы создали несколько групп и добавили одинаковые GroupType
и попытаетесь сохранить.2) Вы создали GroupType вручную вместо того, чтобы получать его из базы данных, в которой 1) применяется снова.
Если у объекта GroupType
нет EntityState
из Unchanged
или Modified
, он попытаетсядобавляйте один и тот же GroupType
снова и снова.Я думаю, что у вас есть два варианта:
- Перед сохранением вашей группы получите GroupType из базы данных и добавьте его в вашу группу.
- Измените EntityState GroupType на то, что вы думаете
EDIT2: Что произойдет, если вы запустите это?
public string TestCRUD()
{
UserService userService = UserServiceFactory.GetService();
User user = new User("Test", "Test", "Test", "TestUser") { Groups = new Collection<Group>() };
GroupType groupType = new GroupType("TestGroupType2", null);
Group group = new Group("TestGroup2", null) { GroupType = groupType };
user.Groups.Add(group);
userService.Save(user);
}
Я ожидаю, что он сохранит пользователя, группу, добавленную к пользователю, и тип группы, добавленный в группу.
Причина, по которой это не будет вызывать дубликаты, заключается в том, что мы вызываем только userService.Save(user);
один раз.Теперь, если бы мы хотели добавить больше групп для пользователя с тем же groupType (по какой-то причине?), Нам бы пришлось немного изменить наш код.
public string TestCRUD()
{
//Expecting that we use IoC or a factory to share the same DbContext on both
//services to avoid already attached or any other weird problems
UserService userService = UserServiceFactory.GetService();
GroupTypeService groupTypeService = GroupTypeServiceFactory.GetService();
GroupType groupType = new GroupType("TestGroupType", null);
groupTypeService.Save(groupType);
/*now if the groupType object has changed its EntityState to Unchanged
we won't do anything, if not:
a) get it from the db or b) set the EntityState manually */
User user = new User("Test", "Test", "Test", "TestUser") { Groups = new Collection<Group>() };
Group group = new Group("TestGroup", null) { GroupType = groupType };
Group group2 = new Group("TestGroup2", null) { GroupType = groupType };
user.Groups.Add(group);
user.Groups.Add(group2);
userService.Save(user);
}
Я ожидаю, что следующий код должен сохранитьПользователь, сохраните группы и сделайте так, чтобы группы указывали на один и тот же групповой тип.
В качестве последнего указателя я хочу подчеркнуть тот факт, что ни при каких обстоятельствах обе службы не должны использовать свой собственный DbContext, они должны использовать один и тот же DbContext, если выхочу, чтобы отслеживать сущности.