无法从数据库正确更新EF模型

时间:2019-12-18 17:42:50

标签: entity-framework

我已经注意到,我现有的实体框架模型中的一个表没有很长时间进行更新。 一个表在数据库中具有新闻列,而在EF模型中不存在。

现在,我需要更新de EF模型以在表中包括这些新列。 因此,从edmx设计器中,我选择了“从数据库更新模型...”选项。

这样做之后,新列将正确添加到EF模型的表中,除了我感兴趣的列。此列是指向另一个表的外键。

那么,为什么要向EF模型中正确添加一些新列,而我没有兴趣呢?

更新: 我首先使用数据库。所以我在这里发布一些细节。

SQL Server中的表如下:

表[eq]。[CalibracionVerificacion]

CREATE TABLE [eq].[CalibracionVerificacion](
    [calibracionVerificacionId] [int] IDENTITY(1,1) NOT NULL,
    [equipoId] [int] NOT NULL,
    [empresaCVId] [int] NULL,
    [usuarioCVMId] [int] NULL,
    [tipo] [smallint] NOT NULL,
    [fechaPrevista] [datetime] NULL,
    [magnitudId] [nvarchar](10) NULL,
    [frecuencia] [smallint] NULL,
    [fechaInforme] [datetime] NULL,
    [usuarioAprobadorId] [int] NULL,
    [fechaAprobacion] [datetime] NULL,
    [procedenciaInforme] [int] NULL,
    [numeroCertificado] [varchar](25) NULL,
    [temperatura] [int] NULL,
    [humedadRelativa] [int] NULL,
    [presionAtmosferica] [int] NULL,
    [incertidumbreMaxima] [decimal](7, 2) NULL,
    [correccionMedidas] [int] NULL,
    [controlRealizado] [int] NULL,
    [observacion] [varchar](500) NULL,
    [equipoComprobacionId] [int] NULL,
    [resultado] [smallint] NOT NULL,
    [estado] [smallint] NOT NULL,
    [fechaCalibracion] [datetime] NULL,
    [unidadFrecuencia] [nvarchar](2) NULL,
 CONSTRAINT [PK__Calibrac__596425FE797F8D7F] PRIMARY KEY CLUSTERED 
(
    [calibracionVerificacionId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [eq].[CalibracionVerificacion]  WITH CHECK ADD  CONSTRAINT [FK_CalibracionVerificacion_Equipo] FOREIGN KEY([equipoId])
REFERENCES [eq].[Equipo] ([equipoId])
ON DELETE CASCADE
GO

ALTER TABLE [eq].[CalibracionVerificacion] CHECK CONSTRAINT [FK_CalibracionVerificacion_Equipo]
GO

ALTER TABLE [eq].[CalibracionVerificacion]  WITH CHECK ADD  CONSTRAINT [FK_CalibracionVerificacion_Equipo1] FOREIGN KEY([equipoComprobacionId])
REFERENCES [eq].[Equipo] ([equipoId])
GO

ALTER TABLE [eq].[CalibracionVerificacion] CHECK CONSTRAINT [FK_CalibracionVerificacion_Equipo1]
GO

表[eq]。[Equipo]

CREATE TABLE [eq].[Equipo](
    [equipoId] [int] IDENTITY(1,1) NOT NULL,
    [empresaPropietariaId] [int] NULL,
    [sociedadId] [varchar](4) NOT NULL,
    [unidadOrganizativaId] [varchar](10) NOT NULL,
    [delegacionPropiedadId] [varchar](4) NULL,
    [magnitudId] [nvarchar](10) NULL,
    [subMagnitudId] [nvarchar](10) NULL,
    [familiaId] [nvarchar](10) NULL,
    [axaptaId] [varchar](10) NULL,
    [denominacion] [varchar](75) NULL,
    [equipoPropio] [smallint] NOT NULL,
    [equipoPatron] [smallint] NOT NULL,
    [usuarioSegundoResponsable] [varchar](75) NULL,
    [mailSegundoResponsable] [varchar](75) NULL,
    [modelo] [varchar](50) NULL,
    [numeroSerie] [varchar](25) NULL,
    [capacidad] [varchar](25) NULL,
    [fechaAdquisicion] [datetime] NULL,
    [fechaFin] [datetime] NULL,
    [precioSinIva] [decimal](10, 2) NULL,
    [observacion] [varchar](500) NULL,
    [motivoBaja] [varchar](500) NULL,
    [estado] [smallint] NOT NULL,
    [equipoIdOldSocotec] [int] NULL,
    [marcaId] [smallint] NULL,
    [limitacion] [varchar](500) NULL,
    [proveedor] [varchar](500) NULL,
    [tipoId] [int] NULL,
    [usuarioResponsableId] [int] NULL,
    [activoFieldeas] [bit] NULL,
 CONSTRAINT [PK_Equipo] PRIMARY KEY CLUSTERED 
(
    [equipoId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

下面是生成的DDL dbModel.edmx.sql。我已经使用模型设计器中的“从数据库更新模型”选项从数据库中抽取了模型,但是您可以看到在表[CalibracionVerificacion]中的模型中未创建作为外键的equipoId和equipoComprobacionId字段。为什么?

-- --------------------------------------------------
-- Dropping existing FOREIGN KEY constraints
-- --------------------------------------------------

IF OBJECT_ID(N'[eq].[FK_CalibracionVerificacion_Equipo]', 'F') IS NOT NULL
    ALTER TABLE [eq].[CalibracionVerificacion] DROP CONSTRAINT [FK_CalibracionVerificacion_Equipo];
GO
IF OBJECT_ID(N'[eq].[FK_CalibracionVerificacion_Equipo1]', 'F') IS NOT NULL
    ALTER TABLE [eq].[CalibracionVerificacion] DROP CONSTRAINT [FK_CalibracionVerificacion_Equipo1];
GO
IF OBJECT_ID(N'[st].[FK_EquipoUtilizado_Equipo]', 'F') IS NOT NULL
    ALTER TABLE [st].[EquipoUtilizado] DROP CONSTRAINT [FK_EquipoUtilizado_Equipo];
GO

-- --------------------------------------------------
-- Dropping existing tables
-- --------------------------------------------------

IF OBJECT_ID(N'[eq].[CalibracionVerificacion]', 'U') IS NOT NULL
    DROP TABLE [eq].[CalibracionVerificacion];
GO
IF OBJECT_ID(N'[eq].[Equipo]', 'U') IS NOT NULL
    DROP TABLE [eq].[Equipo];
GO
IF OBJECT_ID(N'[st].[EquipoUtilizado]', 'U') IS NOT NULL
    DROP TABLE [st].[EquipoUtilizado];
GO

-- --------------------------------------------------
-- Creating all tables
-- --------------------------------------------------

-- Creating table 'Equipo'
CREATE TABLE [dbo].[Equipo] (
    [equipoId] int IDENTITY(1,1) NOT NULL,
    [empresaPropietariaId] int  NULL,
    [sociedadId] varchar(4)  NOT NULL,
    [unidadOrganizativaId] varchar(10)  NOT NULL,
    [magnitudId] nvarchar(10)  NULL,
    [subMagnitudId] nvarchar(10)  NULL,
    [familiaId] nvarchar(10)  NULL,
    [axaptaId] varchar(10)  NULL,
    [denominacion] varchar(75)  NULL,
    [equipoPropio] smallint  NOT NULL,
    [equipoPatron] smallint  NOT NULL,
    [usuarioSegundoResponsable] varchar(75)  NULL,
    [mailSegundoResponsable] varchar(75)  NULL,
    [modelo] varchar(50)  NULL,
    [numeroSerie] varchar(25)  NULL,
    [capacidad] varchar(25)  NULL,
    [fechaAdquisicion] datetime  NULL,
    [fechaFin] datetime  NULL,
    [precioSinIva] decimal(10,2)  NULL,
    [observacion] varchar(500)  NULL,
    [motivoBaja] varchar(500)  NULL,
    [estado] smallint  NOT NULL,
    [equipoIdOldSocotec] int  NULL,
    [marcaId] smallint  NULL,
    [limitacion] varchar(500)  NULL,
    [proveedor] varchar(500)  NULL,
    [delegacionPropiedadId] varchar(4)  NULL,
    [tipoId] int  NULL,
    [usuarioResponsableId] int  NULL,
    [activoFieldeas] bit  NULL
);
GO

-- Creating table 'EquipoUtilizado'
CREATE TABLE [dbo].[EquipoUtilizado] (
    [equipoUtilizadoId] int IDENTITY(1,1) NOT NULL,
    [seguimientoTrabajoId] int  NOT NULL,
    [mantenimiento] bit  NULL,
    [orden] tinyint  NULL,
    [Equipo_equipoId] int  NOT NULL
);
GO

-- Creating table 'CalibracionVerificacion'
CREATE TABLE [dbo].[CalibracionVerificacion] (
    [calibracionVerificacionId] int IDENTITY(1,1) NOT NULL,
    [empresaCVId] int  NULL,
    [usuarioCVMId] int  NULL,
    [tipo] smallint  NOT NULL,
    [fechaPrevista] datetime  NULL,
    [magnitudId] nvarchar(10)  NULL,
    [frecuencia] smallint  NULL,
    [fechaInforme] datetime  NULL,
    [usuarioAprobadorId] int  NULL,
    [fechaAprobacion] datetime  NULL,
    [procedenciaInforme] int  NULL,
    [numeroCertificado] varchar(25)  NULL,
    [temperatura] int  NULL,
    [humedadRelativa] int  NULL,
    [presionAtmosferica] int  NULL,
    [incertidumbreMaxima] decimal(7,2)  NULL,
    [correccionMedidas] int  NULL,
    [controlRealizado] int  NULL,
    [observacion] varchar(500)  NULL,
    [resultado] smallint  NOT NULL,
    [estado] smallint  NOT NULL,
    [fechaCalibracion] datetime  NULL,
    [unidadFrecuencia] nvarchar(2)  NULL,
    [Equipo_equipoId] int  NOT NULL,
    [Equipo1_equipoId] int  NULL
);
GO

-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- --------------------------------------------------

-- Creating primary key on [equipoId] in table 'Equipo'
ALTER TABLE [dbo].[Equipo]
ADD CONSTRAINT [PK_Equipo]
    PRIMARY KEY CLUSTERED ([equipoId] ASC);
GO

-- Creating primary key on [equipoUtilizadoId] in table 'EquipoUtilizado'
ALTER TABLE [dbo].[EquipoUtilizado]
ADD CONSTRAINT [PK_EquipoUtilizado]
    PRIMARY KEY CLUSTERED ([equipoUtilizadoId] ASC);
GO

-- Creating primary key on [calibracionVerificacionId] in table 'CalibracionVerificacion'
ALTER TABLE [dbo].[CalibracionVerificacion]
ADD CONSTRAINT [PK_CalibracionVerificacion]
    PRIMARY KEY CLUSTERED ([calibracionVerificacionId] ASC);
GO

-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- --------------------------------------------------

-- Creating foreign key on [Equipo_equipoId] in table 'EquipoUtilizado'
ALTER TABLE [dbo].[EquipoUtilizado]
ADD CONSTRAINT [FK_EquipoUtilizado_Equipo]
    FOREIGN KEY ([Equipo_equipoId])
    REFERENCES [dbo].[Equipo]
        ([equipoId])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
GO

-- Creating non-clustered index for FOREIGN KEY 'FK_EquipoUtilizado_Equipo'
CREATE INDEX [IX_FK_EquipoUtilizado_Equipo]
ON [dbo].[EquipoUtilizado]
    ([Equipo_equipoId]);
GO

-- Creating foreign key on [Equipo_equipoId] in table 'CalibracionVerificacion'
ALTER TABLE [dbo].[CalibracionVerificacion]
ADD CONSTRAINT [FK_CalibracionVerificacion_Equipo]
    FOREIGN KEY ([Equipo_equipoId])
    REFERENCES [dbo].[Equipo]
        ([equipoId])
    ON DELETE CASCADE ON UPDATE NO ACTION;
GO

-- Creating non-clustered index for FOREIGN KEY 'FK_CalibracionVerificacion_Equipo'
CREATE INDEX [IX_FK_CalibracionVerificacion_Equipo]
ON [dbo].[CalibracionVerificacion]
    ([Equipo_equipoId]);
GO

-- Creating foreign key on [Equipo1_equipoId] in table 'CalibracionVerificacion'
ALTER TABLE [dbo].[CalibracionVerificacion]
ADD CONSTRAINT [FK_CalibracionVerificacion_Equipo1]
    FOREIGN KEY ([Equipo1_equipoId])
    REFERENCES [dbo].[Equipo]
        ([equipoId])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
GO

-- Creating non-clustered index for FOREIGN KEY 'FK_CalibracionVerificacion_Equipo1'
CREATE INDEX [IX_FK_CalibracionVerificacion_Equipo1]
ON [dbo].[CalibracionVerificacion]
    ([Equipo1_equipoId]);
GO

因此,如上所述,由于未在表[CalibracionVerificacion]的模型中创建作为外键的equipoId和equipoComprobacionId字段,因此在Linq查询下不起作用,即fechaPrevista无效,因为c3.equipoId和c .equipoId始终为0,因为equipoId字段始终为0,并且在表CalibracionVerificacion中不存在。因此,问题在于CalibracionVerificacion表中的equipoId字段从未加载到模型中。为什么?

Dim eq = db.Equipo
For Each equipo As Equipo In eq

            Dim fechaPrevista As DateTime? = If(Not (equipo.CalibracionVerificacion.Any()) OrElse
                                               Not (equipo.CalibracionVerificacion.Any(Function(x) Not (String.IsNullOrWhiteSpace(x.magnitudId)))),
                                                                    CType(Nothing, DateTime?),
                                                                    (From c In equipo.CalibracionVerificacion
                                                                     Join c2 In
                                                                         (From c3 In equipo.CalibracionVerificacion
                                                                          Where c3.equipoId = equipo.equipoId AndAlso Not (String.IsNullOrWhiteSpace(c3.magnitudId))
                                                                              Group c3 By c3.magnitudId Into cgroup = Group
                                                                          Select New With
                                                                          {
                                                                              Key .MagnitudID = magnitudId,
                                                                              Key .MaxDate = cgroup.Max(Function(x) x.fechaPrevista)
                                                                          }
                                                                         ) On New With {.JoinProperty1 = c.magnitudId, .JoinProperty2 = c.fechaPrevista} Equals
                                                                              New With {.JoinProperty1 = c2.MagnitudID, .JoinProperty2 = c2.MaxDate}
                                                                     Where c.equipoId = equipo.equipoId
                                                                     Select c).Min(Function(d) d.fechaPrevista))

Next

最后尝试

从模型设计师那里,我删除了所有表格。然后,我通过了“从数据库更新模型...”选项,然后选择了“添加”选项卡。最后,我选择上面表示感兴趣的表,并将所有三个表正确插入到模型edmx中,还将equipoId和equipoComprobacionId字段正确添加到表[CalibracionVerificacion]中。表之间的关系也可以正确创建。最后,我成功构建了解决方案并执行了该解决方案。我在上面的LINQ表达式中放置了一个断点以对其进行调试,在按F10键继续执行后,会抛出一个异常:

  

{“指定的架构无效。错误:关系   未加载“ MyModel.FK_CalibracionVerificacion_Equipo”   类型'MyModel.CalibracionVerificacion'不可用。下列   信息可能有助于解决先前的错误:   类型上不存在必需的属性“ equipoComprobacionId”   “ MyService.CalibracionVerificacion”。

     

关系“ MyModel.FK_CalibracionVerificacion_Equipo1”不是   已加载,因为类型'MyModel.CalibracionVerificacion'不是   可用。以下信息可能有助于解决   先前的错误:所需的属性'equipoComprobacionId'没有   类型“ MyService.CalibracionVerificacion”上存在。

     

“}

以下是EF生成的实体:

Partial Public Class Equipo
    Public Property equipoId As Integer
    Public Property empresaPropietariaId As Nullable(Of Integer)
    Public Property sociedadId As String
    Public Property unidadOrganizativaId As String
    Public Property delegacionPropiedadId As String
    Public Property magnitudId As String
    Public Property subMagnitudId As String
    Public Property familiaId As String
    Public Property axaptaId As String
    Public Property denominacion As String
    Public Property equipoPropio As Short
    Public Property equipoPatron As Short
    Public Property usuarioSegundoResponsable As String
    Public Property mailSegundoResponsable As String
    Public Property modelo As String
    Public Property numeroSerie As String
    Public Property capacidad As String
    Public Property fechaAdquisicion As Nullable(Of Date)
    Public Property fechaFin As Nullable(Of Date)
    Public Property precioSinIva As Nullable(Of Decimal)
    Public Property observacion As String
    Public Property motivoBaja As String
    Public Property estado As Short
    Public Property equipoIdOldSocotec As Nullable(Of Integer)
    Public Property marcaId As Nullable(Of Short)
    Public Property limitacion As String
    Public Property proveedor As String
    Public Property tipoId As Nullable(Of Integer)
    Public Property usuarioResponsableId As Nullable(Of Integer)
    Public Property activoFieldeas As Nullable(Of Boolean)

    Public Overridable Property CalibracionVerificacion As ICollection(Of CalibracionVerificacion) = New HashSet(Of CalibracionVerificacion)
    Public Overridable Property CalibracionVerificacion1 As ICollection(Of CalibracionVerificacion) = New HashSet(Of CalibracionVerificacion)
    Public Overridable Property EquipoUtilizado As ICollection(Of EquipoUtilizado) = New HashSet(Of EquipoUtilizado)

End Class

Partial Public Class CalibracionVerificacion
    Public Property calibracionVerificacionId As Integer
    Public Property equipoId As Integer
    Public Property empresaCVId As Nullable(Of Integer)
    Public Property usuarioCVMId As Nullable(Of Integer)
    Public Property tipo As Short
    Public Property fechaPrevista As Nullable(Of Date)
    Public Property magnitudId As String
    Public Property frecuencia As Nullable(Of Short)
    Public Property fechaInforme As Nullable(Of Date)
    Public Property usuarioAprobadorId As Nullable(Of Integer)
    Public Property fechaAprobacion As Nullable(Of Date)
    Public Property procedenciaInforme As Nullable(Of Integer)
    Public Property numeroCertificado As String
    Public Property temperatura As Nullable(Of Integer)
    Public Property humedadRelativa As Nullable(Of Integer)
    Public Property presionAtmosferica As Nullable(Of Integer)
    Public Property incertidumbreMaxima As Nullable(Of Decimal)
    Public Property correccionMedidas As Nullable(Of Integer)
    Public Property controlRealizado As Nullable(Of Integer)
    Public Property observacion As String
    Public Property equipoComprobacionId As Nullable(Of Integer)
    Public Property resultado As Short
    Public Property estado As Short
    Public Property fechaCalibracion As Nullable(Of Date)
    Public Property unidadFrecuencia As String

    Public Overridable Property Equipo As Equipo
    Public Overridable Property Equipo1 As Equipo

End Class

发生了什么事?

0 个答案:

没有答案