Я пытаюсь создать приложение с помощью C# efcore и SQL Server. Моя проблема заключается в том, как определить некоторые основные концепции вокруг отношений БД. Это покажет мой отсутствие опыта и понимания, но я застрял даже на ранних стадиях. Я пытаюсь реализовать аутентификацию пользователя в приложение. У меня есть таблица под названием «Модель / таблица для user_group_roles», которая имеет всего два столбца для имени и описания. У меня есть другая таблица для user_groups, которая имеет имя, описание. Учитывая, что несколько групп могут быть определены пользователем, и что данная пользовательская фрагмента может быть связана с несколькими группами пользователей, я полагаю, что это являются отношения между многими ко многим. Новая пользовательская группа должна быть в состоянии определить с n -числом пользовательских продуктов, но у пользователя нет функциональности, чтобы добавить новую роль. Пользователь, вместо этого предназначен для непосредственного обеспечения доступа к другой части приложения. Я могу заставить его работать в одну сторону, с точки зрения добавления, но тогда обновления не работают. Получение обновлений, кажется, нарушает добавление, и я уверен, что это, вероятно, просто из -за некоторого базового недоразумения с моей стороны, но я еще не нашел, что это может быть. Что у меня есть до сих пор: < /p>
public class BaseEntity
{
[Key]
[JsonIgnore]
public int Id { get; set; }
public Guid EntityId { get; set; } = Guid.NewGuid();
[JsonIgnore]
public DateTime CreatedDate { get; set; } = DateTime.Now;
[JsonIgnore]
public DateTime UpdatedDate { get; set; }
[JsonIgnore]
public bool IsDeleted { get; set; } = false;
[JsonIgnore]
public int Version { get; set; }
}
public class UserGroup : BaseEntity
{
[Required]
public string Name { get; set; }
[Required]
public string Description { get; set; }
public ICollection? RolesLink { get; set; } = [];
[JsonIgnore]
public List? Users { get; set; } = [];
}
public class UserGroupRole : BaseEntity
{
public string Name { get; set; }
public string Description { get; set; }
public ICollection? UserGroupsLink { get; set; } = [];
}
// defines the many to many join table
public class UserGroupUserGroupRoles
{
public int UserGroupId { get; set; }
public UserGroup UserGroup { get; set; }
public int UserGroupRoleId { get; set; }
public UserGroupRole UserGroupRole { get; set; }
}
public class ImportableUserGroup
{
public string Name { get; set; }
public string Description { get; set; }
public List Roles { get; set; } = [];
}
< /code>
// Db context
public DbSet UserGroupRoles { get; set; }
public DbSet UserGroups { get; set; }
public DbSet Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasKey(x => new { x.UserGroupId, x.UserGroupRoleId });
}
< /code>
// attempting to load user groups from a .json file in Service Layer based on
// settings in appsettings.json which points to the file to load and the filepath
// Based on the appsetttings.json file, load the data from the json file into the database.
public void LoadFileData()
{
foreach (var setting in _appSettings.DataLoaderSettings)
{
if (setting.EntityType == EntitySettingsName && setting.Enabled == true)
{
string jsonString = File.ReadAllText(Path.Combine(_appSettings.DataLoaderPath, setting.FileName));
IEnumerable userGroups = JsonSerializer.Deserialize(jsonString)!;
foreach (var userGroup in userGroups)
{
if (_userGroupRepository.Get(x => x.Name == userGroup.Name) != null)
continue;
AddImportable(userGroup);
}
}
}
}
public void AddImportable(ImportableUserGroup importedUserGroup)
{
// create a new User Group object from the file data
var newUserGroup = new UserGroup
{
Name = importedUserGroup.Name,
Description = importedUserGroup.Description,
};
if (importedUserGroup.Roles == null)
throw new Exception("UserGroupRoles not specified for Group: " + importedUserGroup.Name);
List userGroupUserGroupRoles = new List();
// the file data just includes a user group name, so we need to look up the UserGroupRole object
// and add to an array of UserGroupUserGroupRoles
foreach (var roleName in importedUserGroup.Roles)
{
UserGroupRole role = _userGroupRoleRepository.Get(x => x.Name == roleName);
if (role == null)
throw new Exception("UserGroupRole not found: " + roleName);
userGroupUserGroupRoles.Add(new UserGroupUserGroupRoles { UserGroupRole = role, UserGroup = newUserGroup });
}
//add the array of UserGroupUserGroupRoles to the new User Group object
newUserGroup.RolesLink = userGroupUserGroupRoles;
// add the new User Group object to the database
_userGroupRepository.Add(newUserGroup);
}
// attempting to update UserGroup in the Service layer
public void Update(UserGroup userGroup)
{
if (userGroup.RolesLink == null)
throw new Exception("UserGroupRoles not specified for Group: " + userGroup.Name);
UserGroup foundGroup = _userGroupRepository.Get(x => x.EntityId == userGroup.EntityId);
if (foundGroup == null)
throw new Exception("UserGroup not found: " + userGroup.Name);
List userGroupRoles = new List();
foreach (var userGroupRole in userGroup.RolesLink)
{
UserGroupRole role = _userGroupRoleRepository.Get(x => x.Name == userGroupRole.UserGroupRole.Name);
if (role == null)
throw new Exception("UserGroupRole not found: " + userGroupRole.UserGroupRole.Name);
userGroupRoles.Add(role);
}
foundGroup.Name = userGroup.Name;
foundGroup.Description = userGroup.Description;
foundGroup.RolesLink = userGroup.RolesLink;
_userGroupRepository.Update(foundGroup);
}
// repository layer add method
public void Add(T entity)
{
dbSet.Add(entity);
_db.SaveChanges();
}
// repository layer update method
public void Update(UserGroup entity)
{
var objFromDb = _db.UserGroups.Include(u => u.RolesLink).FirstOrDefault(u => u.EntityId == entity.EntityId);
if (objFromDb != null)
{
objFromDb.Name = entity.Name;
objFromDb.Description = entity.Description;
objFromDb.RolesLink?.Clear();
objFromDb.RolesLink = entity.RolesLink;
_db.UserGroups.Update(objFromDb);
_db.SaveChanges();
}
}
< /code>
Поэтому, когда он пытается загрузить данные файла, я получаю эту ошибку: < /p>
microsoft.entityframeworkcore.dbupdateexception hresult = 0x80131500
message = произошла ошибка при сохранении изменений объекта. См. Внутреннее исключение для подробностей. StackTrace:
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.SqlServer.Update.Internal.SqlServerModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList`1 entries)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList`1 entriesToSave)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(StateManager stateManager, Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.c.b__112_0(DbContext _, ValueTuple`2 t)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
at UserSecurity.DataAccess.Repositories.BaseRepository`1.Add(T entity) in ...\LensCS\LensUserSecurityApi\UserSecurity.DataAccess\Repositories\BaseRepository.cs:line 26
at ....Services.UserGroupService.AddImportable(ImportableUserGroup importedUserGroup) in ...\LensUserSecurityApi\Services\UserGroupService.cs:line 145
at .....Services.UserGroupService.LoadFileData() in ....\Services\UserGroupService.cs:line 68
at Program.$(String[] args) in ......\Program.cs:line 55
This exception was originally thrown at this call stack:
[External Code]
< /code>
Внутреннее исключение 1:
sqlexception: не удается вставить явное значение для столбца идентификации в таблице 'usergrouploles', когда idytity_insert установлен на выключение. < /p >
< /blockquote>
Эта ошибка, кажется, подразумевает, что я пытаюсь добавить новое значение пользователям, просто создав новую пользовательскую группу, которая не пытаюсь здесь делать Полем Я просто хочу добавить новую пользовательскую группу, которую использует существующий usergrouprole
Подробнее здесь: https://stackoverflow.com/questions/794 ... -value-for
EntityFrameWorkCore многих ко многим SQLEXCEPTION: не может вставить явное значение для столбца идентификации в таблице ⇐ C#
Место общения программистов C#
1739883472
Anonymous
Я пытаюсь создать приложение с помощью C# efcore и SQL Server. Моя проблема заключается в том, как определить некоторые основные концепции вокруг отношений БД. Это покажет мой отсутствие опыта и понимания, но я застрял даже на ранних стадиях. Я пытаюсь реализовать аутентификацию пользователя в приложение. У меня есть таблица под названием «Модель / таблица для user_group_roles», которая имеет всего два столбца для имени и описания. У меня есть другая таблица для user_groups, которая имеет имя, описание. Учитывая, что несколько групп могут быть определены пользователем, и что данная пользовательская фрагмента может быть связана с несколькими группами пользователей, я полагаю, что это являются отношения между многими ко многим. Новая пользовательская группа должна быть в состоянии определить с n -числом пользовательских продуктов, но у пользователя нет функциональности, чтобы добавить новую роль. Пользователь, вместо этого предназначен для непосредственного обеспечения доступа к другой части приложения. Я могу заставить его работать в одну сторону, с точки зрения добавления, но тогда обновления не работают. Получение обновлений, кажется, нарушает добавление, и я уверен, что это, вероятно, просто из -за некоторого базового недоразумения с моей стороны, но я еще не нашел, что это может быть. Что у меня есть до сих пор: < /p>
public class BaseEntity
{
[Key]
[JsonIgnore]
public int Id { get; set; }
public Guid EntityId { get; set; } = Guid.NewGuid();
[JsonIgnore]
public DateTime CreatedDate { get; set; } = DateTime.Now;
[JsonIgnore]
public DateTime UpdatedDate { get; set; }
[JsonIgnore]
public bool IsDeleted { get; set; } = false;
[JsonIgnore]
public int Version { get; set; }
}
public class UserGroup : BaseEntity
{
[Required]
public string Name { get; set; }
[Required]
public string Description { get; set; }
public ICollection? RolesLink { get; set; } = [];
[JsonIgnore]
public List? Users { get; set; } = [];
}
public class UserGroupRole : BaseEntity
{
public string Name { get; set; }
public string Description { get; set; }
public ICollection? UserGroupsLink { get; set; } = [];
}
// defines the many to many join table
public class UserGroupUserGroupRoles
{
public int UserGroupId { get; set; }
public UserGroup UserGroup { get; set; }
public int UserGroupRoleId { get; set; }
public UserGroupRole UserGroupRole { get; set; }
}
public class ImportableUserGroup
{
public string Name { get; set; }
public string Description { get; set; }
public List Roles { get; set; } = [];
}
< /code>
// Db context
public DbSet UserGroupRoles { get; set; }
public DbSet UserGroups { get; set; }
public DbSet Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasKey(x => new { x.UserGroupId, x.UserGroupRoleId });
}
< /code>
// attempting to load user groups from a .json file in Service Layer based on
// settings in appsettings.json which points to the file to load and the filepath
// Based on the appsetttings.json file, load the data from the json file into the database.
public void LoadFileData()
{
foreach (var setting in _appSettings.DataLoaderSettings)
{
if (setting.EntityType == EntitySettingsName && setting.Enabled == true)
{
string jsonString = File.ReadAllText(Path.Combine(_appSettings.DataLoaderPath, setting.FileName));
IEnumerable userGroups = JsonSerializer.Deserialize(jsonString)!;
foreach (var userGroup in userGroups)
{
if (_userGroupRepository.Get(x => x.Name == userGroup.Name) != null)
continue;
AddImportable(userGroup);
}
}
}
}
public void AddImportable(ImportableUserGroup importedUserGroup)
{
// create a new User Group object from the file data
var newUserGroup = new UserGroup
{
Name = importedUserGroup.Name,
Description = importedUserGroup.Description,
};
if (importedUserGroup.Roles == null)
throw new Exception("UserGroupRoles not specified for Group: " + importedUserGroup.Name);
List userGroupUserGroupRoles = new List();
// the file data just includes a user group name, so we need to look up the UserGroupRole object
// and add to an array of UserGroupUserGroupRoles
foreach (var roleName in importedUserGroup.Roles)
{
UserGroupRole role = _userGroupRoleRepository.Get(x => x.Name == roleName);
if (role == null)
throw new Exception("UserGroupRole not found: " + roleName);
userGroupUserGroupRoles.Add(new UserGroupUserGroupRoles { UserGroupRole = role, UserGroup = newUserGroup });
}
//add the array of UserGroupUserGroupRoles to the new User Group object
newUserGroup.RolesLink = userGroupUserGroupRoles;
// add the new User Group object to the database
_userGroupRepository.Add(newUserGroup);
}
// attempting to update UserGroup in the Service layer
public void Update(UserGroup userGroup)
{
if (userGroup.RolesLink == null)
throw new Exception("UserGroupRoles not specified for Group: " + userGroup.Name);
UserGroup foundGroup = _userGroupRepository.Get(x => x.EntityId == userGroup.EntityId);
if (foundGroup == null)
throw new Exception("UserGroup not found: " + userGroup.Name);
List userGroupRoles = new List();
foreach (var userGroupRole in userGroup.RolesLink)
{
UserGroupRole role = _userGroupRoleRepository.Get(x => x.Name == userGroupRole.UserGroupRole.Name);
if (role == null)
throw new Exception("UserGroupRole not found: " + userGroupRole.UserGroupRole.Name);
userGroupRoles.Add(role);
}
foundGroup.Name = userGroup.Name;
foundGroup.Description = userGroup.Description;
foundGroup.RolesLink = userGroup.RolesLink;
_userGroupRepository.Update(foundGroup);
}
// repository layer add method
public void Add(T entity)
{
dbSet.Add(entity);
_db.SaveChanges();
}
// repository layer update method
public void Update(UserGroup entity)
{
var objFromDb = _db.UserGroups.Include(u => u.RolesLink).FirstOrDefault(u => u.EntityId == entity.EntityId);
if (objFromDb != null)
{
objFromDb.Name = entity.Name;
objFromDb.Description = entity.Description;
objFromDb.RolesLink?.Clear();
objFromDb.RolesLink = entity.RolesLink;
_db.UserGroups.Update(objFromDb);
_db.SaveChanges();
}
}
< /code>
Поэтому, когда он пытается загрузить данные файла, я получаю эту ошибку: < /p>
microsoft.entityframeworkcore.dbupdateexception hresult = 0x80131500
message = произошла ошибка при сохранении изменений объекта. См. Внутреннее исключение для подробностей. StackTrace:
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.SqlServer.Update.Internal.SqlServerModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList`1 entries)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList`1 entriesToSave)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(StateManager stateManager, Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.c.b__112_0(DbContext _, ValueTuple`2 t)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
at UserSecurity.DataAccess.Repositories.BaseRepository`1.Add(T entity) in ...\LensCS\LensUserSecurityApi\UserSecurity.DataAccess\Repositories\BaseRepository.cs:line 26
at ....Services.UserGroupService.AddImportable(ImportableUserGroup importedUserGroup) in ...\LensUserSecurityApi\Services\UserGroupService.cs:line 145
at .....Services.UserGroupService.LoadFileData() in ....\Services\UserGroupService.cs:line 68
at Program.$(String[] args) in ......\Program.cs:line 55
This exception was originally thrown at this call stack:
[External Code]
< /code>
Внутреннее исключение 1:
sqlexception: не удается вставить явное значение для столбца идентификации в таблице 'usergrouploles', когда idytity_insert установлен на выключение. < /p >
< /blockquote>
Эта ошибка, кажется, подразумевает, что я пытаюсь добавить новое значение пользователям, просто создав новую пользовательскую группу, которая не пытаюсь здесь делать Полем Я просто хочу добавить новую пользовательскую группу, которую использует [b] [/b] существующий usergrouprole
Подробнее здесь: [url]https://stackoverflow.com/questions/79448322/entityframeworkcore-many-to-many-sqlexception-cannot-insert-explicit-value-for[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия