【问题标题】:.NET mvc adding more then 1 entity to db.NET mvc 向 db 添加超过 1 个实体
【发布时间】:2018-11-20 00:36:57
【问题描述】:

我正在尝试向数据库中添加多个实体,但出现此错误:

“保存或接受更改失败,因为多个 'Schema.Domain.DataModels.ActivitySummery' 类型的实体具有相同的主键值。确保显式设置的主键值是唯一的。确保数据库生成的主键是在数据库和实体框架模型中正确配置。使用实体设计器进行数据库优先/模型优先配置。使用“HasDatabaseGeneratedOption”流式 API 或“DatabaseGeneratedAttribute”进行代码优先配置。”

public void CreateNewGeneratedSchema(List<WeekDayViewModel> weekDays, int userId)
    {
        List<ActivitySummery> savedActivities = _schemaRepository.GetAllActivitySummeries(userId).ToList();
        foreach(ActivitySummery activitySummery in savedActivities)
        {
            _schemaRepository.DeleteActivitySummery(activitySummery.ActivitySummeryId);
        }

        foreach (WeekDayViewModel weekDay in weekDays)
        {
            foreach (ActivitySummeryViewModel activitySummeryViewModel in weekDay.ActivitiySummeries)
            {
                try
                {
                    ActivitySummery activitySummery = new ActivitySummery()
                    {
                        ActivityId = activitySummeryViewModel.ActivityId,
                        WeekDayId = activitySummeryViewModel.WeekDayId,
                        //Change userId
                        UserId = 1,
                        StartTime = activitySummeryViewModel.StartTime,
                        EndTime = activitySummeryViewModel.EndTime,
                        ActivityDescription = activitySummeryViewModel.Description,
                        Activity = _schemaRepository.GetSpecificActivity(activitySummeryViewModel.ActivityId),
                        WeekDay = _schemaRepository.GetSpecificWeekDay(activitySummeryViewModel.WeekDayId)
                    };
                    _schemaRepository.CreateActivitySummery(activitySummery);
                }
                catch (Exception)
                {
                    throw new Exception("Something went wrong when trying to save the activity summery");
                }
            }
        }
        _schemaRepository.Save();
        _schemaRepository.Dispose();
    }

我知道一种可能可行的解决方案,它是在每次我将一个模型添加到数据库并创建 _schemaRepository 的新实例之后保存和处置 _schemaRepository。但我不确定这是否是正确的方法。我知道我试图保存的每个模型的 pk 为 0,我认为这可能是问题所在。但是它仍然有效并且数据库接受新实体,但我仍然得到异常。

【问题讨论】:

  • [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 只使用身份?
  • 我没有先使用代码
  • 使用 fleunt API 执行此操作,那么您不必关心 Id。

标签: asp.net-mvc entity-framework sql-server-2008-r2


【解决方案1】:

如果您的模型(您没有显示)的主键为 ActivityId(您也没有指出)并且它被设置为自动生成主键:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ActivityId { get; set; }

那么你不能CreateActivitySummery 方法中包含主键(你也没有提供)。

// Remove this line...
// ActivityId = activitySummary.ActivityId;

请注意,让数据库自动生成主键的(合理)替代方法是使用 Guid/UniqueIdentifier 而不使用 DatabaseGenerated。然后您的应用程序代码可以使用Guid.NewGuid 生成新的(可能是唯一的)主键,它可以毫无问题地插入并轻松跟踪相关实体。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多