我正在尝试向数据库中添加几个实体,但是我收到了这个错误:
“保存或接受更改失败,因为多个”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接受新实体,但我仍然得到异常。
答案 0 :(得分:0)
如果您的模型(您没有显示)的主键为ActivityId
(您也没有说明),并且设置为自动生成主键:< / p>
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ActivityId { get; set; }
然后不得在CreateActivitySummery
方法中包含主键(也是您未提供的方法)。
// Remove this line...
// ActivityId = activitySummary.ActivityId;
请注意,让数据库自动生成主键的(合理)替代方法是使用Guid / UniqueIdentifier而不使用DatabaseGenerated
。然后,您的应用程序代码可以使用Guid.NewGuid
生成新的(可能是唯一的)主键,它可以毫无问题地插入,并轻松跟踪相关实体。