.NET mvc向db

时间:2016-07-10 10:29:57

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

我正在尝试向数据库中添加几个实体,但是我收到了这个错误:

“保存或接受更改失败,因为多个”Schema.Domain.DataModels.ActivitySummery“类型的实体具有相同的主键值。请确保显式设置主键值是唯一的。确保数据库生成的主键是在数据库和Entity Framework模型中正确配置。使用Entity Designer for Database First / Model First配置。使用'HasDatabaseGeneratedOption'流畅API或'DatabaseGeneratedAttribute'进行Code First配置。“

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。但我不确定这是否正确。我知道我试图保存的每个模型都有0的pk,我认为这可能是问题所在。但它仍然有效,db接受新实体,但我仍然得到异常。

1 个答案:

答案 0 :(得分:0)

如果您的模型(您没有显示)的主键为ActivityId(您也没有说明),并且设置为自动生成主键:< / p>

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

然后不得CreateActivitySummery方法中包含主键(也是您未提供的方法)。

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

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