Я пытаюсь сохранить данные в своей базе данных (MS SQL 2012) из моего приложения ASP.NET Core (2.0), но одна из таблиц в моей БД выдает ошибку при попытке обновить ее данные.
Я использовал Entity Framework Core (2.1.2) для генерации DB-контекста, который выполняет операцию сохранения. Когда я пытаюсь сохранить изменения в таблице «Пользователь», происходит сбой приложения со следующим исключением:
Произошла ошибка при обновлении записей. Подробности смотрите во внутреннем исключении.
И внутреннее исключение:
Невозможно привести объект типа 'System.String' к типу 'System.Int32'.
Код, который я использую для сохранения данных:
using(var context = new DBContext())
{
var user = null;
var passwordReset = await GetPasswordResetWithinFifteenMinutesAsync(id);
if (passwordReset != null)
{
user = await context.Users
.Where(u => u.Id == passwordReset.FkUser)
.FirstOrDefaultAsync();
user.Password = password;
context.Remove(passwordReset);
await context.SaveChangesAsync(); //This is where the app crashes
}
return user?.ToUserModel() ?? null;
}
Модель, которую возвращает GetPasswordResetWithinFifteenMinutesAsync (), выглядит следующим образом:
public partial class PartnerPasswordreset
{
public int PkId { get; set; }
public int FkUser { get; set; }
public Guid RequestId { get; set; }
public DateTime TimeReset { get; set; }
public Users FkUserNavigation { get; set; }
}
Код модели Users:
public partial class Users
{
public Users()
{
CustomerTurnoverPotentialFkCreatedByUser = new HashSet<CustomerTurnoverPotential>();
CustomerTurnoverPotentialFkUpdatedByUser = new HashSet<CustomerTurnoverPotential>();
KeyValues = new HashSet<KeyValues>();
Salespersons = new HashSet<Salespersons>();
SupplierUsers = new HashSet<SupplierUsers>();
UserAddresses = new HashSet<UserAddresses>();
UserCustomers = new HashSet<UserCustomers>();
UserSuppliers = new HashSet<UserSuppliers>();
PartnerLeadComments = new HashSet<PartnerLeadComments>();
PartnerPasswordreset = new HashSet<PartnerPasswordreset>();
PartnerUserFormAccess = new HashSet<PartnerUserFormAccess>();
}
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public int? PackageId { get; set; }
public DateTime? BirthDate { get; set; }
public int? CampaignId { get; set; }
public string PasswordResetCode { get; set; }
public bool ReceiveNewsLetter { get; set; }
public int? CrmUserId { get; set; }
public bool? TermsAccepted { get; set; }
public bool DataStorageConsentFb { get; set; }
public bool MarketingUsageConsentFb { get; set; }
public bool DataStorageConsentFa { get; set; }
public bool MarketingUsageConsentFa { get; set; }
public CustomerCampaign Campaign { get; set; }
public Packages Package { get; set; }
public ICollection<CustomerTurnoverPotential> CustomerTurnoverPotentialFkCreatedByUser { get; set; }
public ICollection<CustomerTurnoverPotential> CustomerTurnoverPotentialFkUpdatedByUser { get; set; }
public ICollection<KeyValues> KeyValues { get; set; }
public ICollection<Salespersons> Salespersons { get; set; }
public ICollection<SupplierUsers> SupplierUsers { get; set; }
public ICollection<UserAddresses> UserAddresses { get; set; }
public ICollection<UserCustomers> UserCustomers { get; set; }
public ICollection<UserSuppliers> UserSuppliers { get; set; }
public ICollection<PartnerLeadComments> PartnerLeadComments { get; set; }
public ICollection<PartnerPasswordreset> PartnerPasswordreset { get; set; }
public ICollection<PartnerUserFormAccess> PartnerUserFormAccess { get; set; }
internal UserModel ToUserModel()
{
if (UserSuppliers == null)
{
return null;
}
var roles = new List<string>();
var menus = new List<string>();
foreach (var us in UserSuppliers)
{
roles.Add(us.FkUserRoleNavigation.Role);
var menuAccess = us.FkUserRoleNavigation?.PartnerMenuAccess;
foreach (var menu in menuAccess)
{
menus.Add($"{menu.FkPartnerMenuNavigation.Name};{menu.FkPartnerMenuNavigation.Path}");
}
}
return new UserModel
{
UserId = Id,
FirstName = FirstName,
LastName = LastName,
UserName = Email,
Password = Password,
Roles = roles,
Menus = menus
};
}
internal CustomerUserModel ToCustomerUserModel()
{
return new CustomerUserModel
{
FirstName = FirstName,
LastName = LastName,
Email = Email,
Phone = Phone
};
}
}
Объект Users, созданный EF, имеет следующий построитель моделей:
modelBuilder.Entity<Users>(entity =>
{
entity.HasIndex(e => e.Email)
.HasName("UQ__Users__A9D10534165A2CA1")
.IsUnique();
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.BirthDate).HasColumnType("datetime");
entity.Property(e => e.CreatedDate)
.HasColumnType("smalldatetime")
.HasDefaultValueSql("(getdate())");
entity.Property(e => e.CrmUserId).HasColumnName("CrmUserID");
entity.Property(e => e.DataStorageConsentFa).HasColumnName("DataStorageConsent_FA");
entity.Property(e => e.DataStorageConsentFb).HasColumnName("DataStorageConsent_FB");
entity.Property(e => e.Email)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false)
.HasDefaultValueSql("('')");
entity.Property(e => e.FirstName)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false)
.HasDefaultValueSql("('')");
entity.Property(e => e.LastName)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false)
.HasDefaultValueSql("('')");
entity.Property(e => e.MarketingUsageConsentFa).HasColumnName("MarketingUsageConsent_FA");
entity.Property(e => e.MarketingUsageConsentFb).HasColumnName("MarketingUsageConsent_FB");
entity.Property(e => e.Password)
.IsUnicode(false)
.HasDefaultValueSql("('')");
entity.Property(e => e.PasswordResetCode)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.Phone)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false)
.HasDefaultValueSql("('')");
entity.Property(e => e.TermsAccepted)
.IsRequired()
.HasDefaultValueSql("((1))");
entity.HasOne(d => d.Campaign)
.WithMany(p => p.Users)
.HasForeignKey(d => d.CampaignId)
.HasConstraintName("FK__Users__CampaignI__0BDC9E2E");
entity.HasOne(d => d.Package)
.WithMany(p => p.Users)
.HasForeignKey(d => d.PackageId)
.HasConstraintName("fk_Users_Packagess");
});
И таблица БД для Пользователей выглядит так при сценарии:
USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Users](
[id] [int] IDENTITY(1,1) NOT NULL,
[CreatedDate] [smalldatetime] NOT NULL,
[FirstName] [varchar](50) NOT NULL,
[LastName] [varchar](50) NOT NULL,
[Phone] [varchar](50) NOT NULL,
[Email] [varchar](50) NOT NULL,
[Password] [varchar](max) NULL,
[PackageId] [int] NULL,
[BirthDate] [datetime] NULL,
[CampaignId] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[Users] ADD [PasswordResetCode] [varchar](50) NULL
ALTER TABLE [dbo].[Users] ADD [ReceiveNewsLetter] [bit] NOT NULL
ALTER TABLE [dbo].[Users] ADD [CrmUserID] [int] NULL
ALTER TABLE [dbo].[Users] ADD [TermsAccepted] [bit] NOT NULL
ALTER TABLE [dbo].[Users] ADD [DataStorageConsent_FB] [bit] NOT NULL
ALTER TABLE [dbo].[Users] ADD [MarketingUsageConsent_FB] [bit] NOT NULL
ALTER TABLE [dbo].[Users] ADD [DataStorageConsent_FA] [bit] NOT NULL
ALTER TABLE [dbo].[Users] ADD [MarketingUsageConsent_FA] [bit] NOT NULL
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
UNIQUE NONCLUSTERED
(
[Email] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [DF_Users_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate]
GO
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [DF_Users_FirstName] DEFAULT ('') FOR [FirstName]
GO
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [DF_Users_LastName] DEFAULT ('') FOR [LastName]
GO
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [DF_Users_Phone] DEFAULT ('') FOR [Phone]
GO
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [DF_Users_Email] DEFAULT ('') FOR [Email]
GO
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [DF_Users_Password] DEFAULT ('') FOR [Password]
GO
ALTER TABLE [dbo].[Users] ADD DEFAULT ((0)) FOR [ReceiveNewsLetter]
GO
ALTER TABLE [dbo].[Users] ADD DEFAULT ((0)) FOR [TermsAccepted]
GO
ALTER TABLE [dbo].[Users] ADD DEFAULT ((0)) FOR [DataStorageConsent_FB]
GO
ALTER TABLE [dbo].[Users] ADD DEFAULT ((0)) FOR [MarketingUsageConsent_FB]
GO
ALTER TABLE [dbo].[Users] ADD DEFAULT ((0)) FOR [DataStorageConsent_FA]
GO
ALTER TABLE [dbo].[Users] ADD DEFAULT ((0)) FOR [MarketingUsageConsent_FA]
GO
ALTER TABLE [dbo].[Users] WITH CHECK ADD FOREIGN KEY([CampaignId])
REFERENCES [dbo].[CustomerCampaign] ([id])
GO
ALTER TABLE [dbo].[Users] WITH CHECK ADD CONSTRAINT [fk_Users_Packagess] FOREIGN KEY([PackageId])
REFERENCES [dbo].[Packages] ([id])
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [fk_Users_Packagess]
GO
Я предполагаю, что есть несоответствие между тем, что генерировало EF, и фактической структурой базы данных, но я не могу найти это. Есть идеи?
(Я также попытался удалить все свойства из объекта Users, кроме id и Email, а затем запустить обновление, но я все еще получаю то же исключение.)