使用EF核心和Im试图更新实体的列/属性。EF核心更新为什么无法更新修改的列
该列有一个外键约束...可为空并且是一个int。
同一个表/实体具有三个或四个其他列/属性相同的数据类型也是制约外键...和可空
当我更新的任何使用Update命令这些列的值...它工作得很好......除了一列。当我尝试更新那一列并处理更新时,它将保存所有更改......但是该列只是将其恢复为以前的值。
它不会抛出异常..没有任何错误......只是将其恢复为原始值并继续。
下面是该实体的情况下进入....有问题的列是car_app_id
没有什么背景文件中区分特定列是从其他...没有什么不同从其他列不同外键约束...
{
entity.HasKey(e => e.AppId)
.HasName("PK_tbl_apps");
entity.ToTable("tbl_apps");
entity.Property(e => e.AppId).HasColumnName("app_id");
entity.Property(e => e.Active).HasColumnName("active");
entity.Property(e => e.AppAcro)
.HasColumnName("app_acro")
.HasColumnType("varchar(50)");
entity.Property(e => e.AppDesc)
.HasColumnName("app_desc")
.HasColumnType("varchar(5000)");
entity.Property(e => e.AppTypeId).HasColumnName("app_type_id");
entity.Property(e => e.BuildTypeId).HasColumnName("build_type_id");
entity.Property(e => e.CarAppId).HasColumnName("car_app_id");
entity.Property(e => e.ControlLevelId).HasColumnName("control_level_id");
entity.Property(e => e.Deleted).HasColumnName("deleted");
entity.HasOne(d => d.AppType)
.WithMany(p => p.TblApps)
.HasForeignKey(d => d.AppTypeId)
.HasConstraintName("FK_tbl_apps_tbl_app_types");
entity.HasOne(d => d.BuildType)
.WithMany(p => p.TblApps)
.HasForeignKey(d => d.BuildTypeId)
.HasConstraintName("FK_tbl_apps_tbl_build_types");
entity.HasOne(d => d.CarApp)
.WithMany(p => p.TblApps)
.HasForeignKey(d => d.CarAppId)
.HasConstraintName("FK_tbl_apps_tbl_car_apps");
entity.HasOne(d => d.ControlLevel)
.WithMany(p => p.TblApps)
.HasForeignKey(d => d.ControlLevelId)
.HasConstraintName("FK_tbl_apps_tbl_control_level");
});
这是我用来test..this的代码是简单的测试代码,试图找出为什么心不是更新工作。它非常基本的存储库
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
private omni_dbContext context { get; set; }
private DbSet<TEntity> dbset { get; set; }
public Repository()
{
try
{
context = new omni_dbContext();
dbset = context.Set<TEntity>();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally { }
}
public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,
params Expression<Func<TEntity, object>>[] includeProperties)
{
try
{
IQueryable<TEntity> query = dbset;
if (filter != null)
{
query = query.Where(filter);
}
if (includeProperties != null)
{
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
}
return query.ToList();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally { }
}
public void Update(TEntity entity)
{
try
{
context.Update(entity);
context.SaveChanges();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally { }
}
}
}
因此,我使用Manager类来为实体实例化存储库并进行数据调用。
基本上我得到一组记录...挑出一条记录...更新属性并将其发送回更新,每个字段都会更新,但是实体将car_app_id属性重置为先前的任何值我修改它,我不明白为什么。
EalmsEF.AppManager manager = new EalmsEF.AppManager();
var apps = manager.GetActiveFull().Where(a => a.CarAppId != null).ToList();
var app = apps[0];
app.CarAppId = 2;
app.BuildTypeId = 2;
manager.Update(app);
下面是几个图像,显示数据库中外键约束到列的配置以及列的属性。
如果任何人有任何想法,为什么这一个栏会拒绝正确更新这将是一个很大的帮助。
UPDATE :::
我创建了复制数据库结构和生成测试数据的SQL脚本。基本上你创建一个名为test..runt的数据库两个脚本,这个重复的数据库创建的问题可以被复制。
USE [test]
GO
/****** Object: Table [dbo].[tbl_control_level] Script Date: 2/21/2017 3:30:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_control_level](
[control_level_id] [int] IDENTITY(1,1) NOT NULL,
[control_level] [varchar](50) NULL,
[description] [varchar](1000) NULL,
[deleted] [bit] NULL,
CONSTRAINT [PK_tbl_control_level] PRIMARY KEY CLUSTERED
(
[control_level_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[tbl_app_types] Script Date: 2/21/2017 3:29:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_app_types](
[app_type_id] [int] IDENTITY(1,1) NOT NULL,
[app_type] [varchar](50) NULL,
[deleted] [bit] NULL,
CONSTRAINT [PK_tbl_app_types] PRIMARY KEY CLUSTERED
(
[app_type_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[tbl_car_apps] Script Date: 2/21/2017 3:31:32 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_car_apps](
[car_app_id] [int] IDENTITY(1,1) NOT NULL,
[car_id] [varchar](50) NULL,
[deleted] [bit] NULL,
CONSTRAINT [PK_tbl_car_apps] PRIMARY KEY CLUSTERED
(
[car_app_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[tbl_control_level] Script Date: 2/21/2017 3:30:29 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_control_level](
[control_level_id] [int] IDENTITY(1,1) NOT NULL,
[control_level] [varchar](50) NULL,
[description] [varchar](1000) NULL,
[deleted] [bit] NULL,
CONSTRAINT [PK_tbl_control_level] PRIMARY KEY CLUSTERED
(
[control_level_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[tbl_build_types] Script Date: 2/21/2017 3:29:15 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_build_types](
[build_type_id] [int] IDENTITY(1,1) NOT NULL,
[build_type] [varchar](50) NULL,
[deleted] [bit] NULL,
CONSTRAINT [PK_tbl_build_types] PRIMARY KEY CLUSTERED
(
[build_type_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[tbl_apps] Script Date: 2/21/2017 3:25:58 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbl_apps](
[app_id] [int] IDENTITY(1,1) NOT NULL,
[app_acro] [varchar](50) NULL,
[app_name] [varchar](100) NULL,
[app_type_id] [int] NULL,
[control_level_id] [int] NULL,
[build_type_id] [int] NULL,
[car_app_id] [int] NULL,
[deleted] [bit] NULL,
CONSTRAINT [PK_tbl_apps] PRIMARY KEY CLUSTERED
(
[app_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tbl_apps] WITH CHECK ADD CONSTRAINT [FK_tbl_apps_tbl_app_types] FOREIGN KEY([app_type_id])
REFERENCES [dbo].[tbl_app_types] ([app_type_id])
GO
ALTER TABLE [dbo].[tbl_apps] CHECK CONSTRAINT [FK_tbl_apps_tbl_app_types]
GO
ALTER TABLE [dbo].[tbl_apps] WITH CHECK ADD CONSTRAINT [FK_tbl_apps_tbl_build_types] FOREIGN KEY([build_type_id])
REFERENCES [dbo].[tbl_build_types] ([build_type_id])
GO
ALTER TABLE [dbo].[tbl_apps] CHECK CONSTRAINT [FK_tbl_apps_tbl_build_types]
GO
ALTER TABLE [dbo].[tbl_apps] WITH CHECK ADD CONSTRAINT [FK_tbl_apps_tbl_car_apps] FOREIGN KEY([car_app_id])
REFERENCES [dbo].[tbl_car_apps] ([car_app_id])
GO
ALTER TABLE [dbo].[tbl_apps] CHECK CONSTRAINT [FK_tbl_apps_tbl_car_apps]
GO
ALTER TABLE [dbo].[tbl_apps] WITH CHECK ADD CONSTRAINT [FK_tbl_apps_tbl_control_level] FOREIGN KEY([control_level_id])
REFERENCES [dbo].[tbl_control_level] ([control_level_id])
GO
ALTER TABLE [dbo].[tbl_apps] CHECK CONSTRAINT [FK_tbl_apps_tbl_control_level]
GO
USE [test]
GO
INSERT INTO [dbo].[tbl_app_types]
([app_type]
,[deleted])
VALUES
('app type 1'
,0)
GO
INSERT INTO [dbo].[tbl_app_types]
([app_type]
,[deleted])
VALUES
('app type 2'
,0)
GO
INSERT INTO [dbo].[tbl_build_types]
([build_type]
,[deleted])
VALUES
('build type 1'
,0)
GO
INSERT INTO [dbo].[tbl_build_types]
([build_type]
,[deleted])
VALUES
('build type 2'
,0)
GO
INSERT INTO [dbo].[tbl_control_level]
([control_level]
,[description]
,[deleted])
VALUES
('ct 1'
,''
,0)
GO
INSERT INTO [dbo].[tbl_control_level]
([control_level]
,[description]
,[deleted])
VALUES
('ct 2'
,''
,0)
GO
INSERT INTO [dbo].[tbl_car_apps]
([car_id]
,[deleted])
VALUES
('1'
,0)
GO
INSERT INTO [dbo].[tbl_car_apps]
([car_id]
,[deleted])
VALUES
('2'
,0)
GO
INSERT INTO [dbo].[tbl_apps]
([app_acro]
,[app_name]
,[app_type_id]
,[control_level_id]
,[build_type_id]
,[car_app_id]
,[deleted])
VALUES
('testapp1'
,''
,1
,1
,1
,1
,0)
GO
INSERT INTO [dbo].[tbl_apps]
([app_acro]
,[app_name]
,[app_type_id]
,[control_level_id]
,[build_type_id]
,[car_app_id]
,[deleted])
VALUES
('testapp2'
,''
,1
,1
,1
,1
,0)
GO
在更新外键值后,您是否正在加载更多数据? –
这种关系走哪条路?不更新汽车表中的密钥是否打破与其他表的关系? –
我没有做任何进一步的更新或加载数据。它的一个简单的获取记录修改属性并更新实体。至于更新密钥..我不更新车表中的密钥..我更新应用程序表中的引用列到车表中不同的可行记录。 – Bastyon