2017-02-21 88 views
2

使用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); 

下面是几个图像,显示数据库中外键约束到列的配置以及列的属性。

enter image description here enter image description here

如果任何人有任何想法,为什么这一个栏会拒绝正确更新这将是一个很大的帮助。

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 
+0

在更新外键值后,您是否正在加载更多数据? –

+0

这种关系走哪条路?不更新汽车表中的密钥是否打破与其他表的关系? –

+0

我没有做任何进一步的更新或加载数据。它的一个简单的获取记录修改属性并更新实体。至于更新密钥..我不更新车表中的密钥..我更新应用程序表中的引用列到车表中不同的可行记录。 – Bastyon

回答

0

看起来像我想出来的。

经过一些进一步的调查,这是我发现的...

与包括object..so这个特殊instance..the CarApp对象被列入导航被得到,这是被更新的实体“获得”的记录。出于某种原因,这导致更新将更改重置为导航属性中设置为的任何值。

出于好奇,我添加了其他属性作为包括获取和它开始与他们相同的行为...当我删除所有包括导航属性,并试图保存更新它工作正常。

因此,基本上如果你打算对包含导航属性的实体进行更新,那么约束列就是......你要么必须更新该属性。否则,从更新中删除引用property