Зависимое свойство в ReferentialConstraint отображается в столбец, созданный магазином. Колонка: - PullRequest
1 голос
/ 07 марта 2012

Во-первых, спасибо, что нашли время, чтобы прочитать это. У меня возникли некоторые трудности при попытке обновить базу данных с помощью EF. Я использовал этот же подход ранее в другом проекте, поэтому я думаю, что проблема, возможно, в базе данных, но я просто не вижу этого. База данных является устаревшей базой данных в SQL 2005, и соглашение об именах имеет много желаемого, поэтому я сопоставляю несовместимые имена с чем-то более согласованным с помощью метода HasColumnName: как в.

        modelBuilder.Entity<Case_Person_1>().ToTable("dbo.Case_Person_1");
        modelBuilder.Entity<Case_Person_1>().Property(c => c.Id).HasColumnName("CaseNumber");

Я сравнил свою проблему с другими подобными и исследовал, чтобы убедиться, что отношения внешнего ключа направлены в правильном направлении и что идентификация есть только на ПК. Когда у меня НЕ установлен параметр «Генерация данных» явно, команда запускается для базы данных, но она не работает, потому что я вставляю 0 в качестве ключа, а параметр «Явный» установлен на «ВЫКЛ. Я вижу это в SQL Profiler. Когда я добавляю опцию «Идентичность», я получаю сообщение об ошибке ограничения ссылок.

Я потерял 2 дня на этом, и я не приблизился к решению, и я в значительной степени в конце своей веревки. Кроме того, в моем другом проекте мне не нужно было украшать свои POCO с помощью DatabaseGeneratedOption, но я не получил никакой ошибки при вставках. Я не знал, было ли это в SQL 2005, или я что-то упустил ...


полная информация об ошибке здесь: System.Data.Entity.Infrastructure.DbUpdateException перехвачено
Сообщение = Произошла ошибка при обновлении записей. Увидеть внутренний исключение для деталей. Source = EntityFramework StackTrace: в System.Data.Entity.Internal.InternalContext.SaveChanges () в System.Data.Entity.Internal.LazyInternalContext.SaveChanges () в System.Data.Entity.DbContext.SaveChanges () в Scyfis.Ocyf.DataLayer.EntityExtensions.AddItem [T] (T entity, DbSet 1 dbSet, DbContext context, Action 2 foriegnKeyUpdater) в C: \ TFS \ CGProjects \ ГПЦ \ SCYFIS \ PHTSY \ Dev \ SRC \ Datalayer \ Helpers \ EntityExtensions.cs: линии 83 в Scyfis.Ocyf.DataLayer.EntityExtensions.SaveItem [T] (T entity, DbSet 1 dbSet, DbContext context, Action 2 foriegnKeyUpdater) в C: \ TFS \ CGProjects \ ГПЦ \ SCYFIS \ PHTSY \ Dev \ SRC \ Datalayer \ Helpers \ EntityExtensions.cs: линии 27 в Scyfis.Ocyf.DataLayer.Case_PHTSYRepository.Save (модель Case_PHTSY) в C: \ TFS \ CGProjects \ ГПЦ \ SCYFIS \ PHTSY \ Dev \ SRC \ Datalayer \ Custom \ Case_PHTSYRepository.cs: линия 44 в Scyfis.Ocyf.Service.Case_PHTSYService.Create (модель Case_PHTSY) в C: \ TFS \ CGProjects \ ГПЦ \ SCYFIS \ PHTSY \ Dev \ SRC \ Service \ Custom \ Case_PHTSYService.cs: линия 184 InnerException: System.Data.UpdateException Сообщение = Произошла ошибка при обновлении записей. Смотрите внутреннее исключение для деталей. Источник = System.Data.Entity Трассировки стека: в System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands (ChangeNode changeNode, компилятор UpdateCompiler) в System.Data.Mapping.Update.Internal.UpdateTranslator.d_ 0.MoveNext () на System.Linq.Enumerable.d _71 1.MoveNext() at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable 1 команды, переводчик UpdateTranslator) в System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands () в System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, адаптер IEntityAdapter) в System.Data.EntityClient.EntityAdapter.Update (IEntityStateManager entityCache) в System.Data.Objects.ObjectContext.SaveChanges (параметры SaveOptions) в System.Data.Entity.Internal.InternalContext.SaveChanges () InnerException: System.InvalidOperationException Сообщение = зависимое свойство в ReferentialConstraint отображается в столбец, созданный хранилищем Колонка: «Id». Источник = System.Data.Entity Трассировки стека: в System.Data.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses (DbExpressionBinding target, строка PropagatorResult, PropagatorResult originalRow,Процессор TableChangeProcessor, Boolean insertMode, Dictionary`2 & outputIdentifiers, DbExpression & returning, Boolean & rowMustBeTouched) в System.Data.Mapping.Update.Internal.UpdateCompiler.BuildInsertCommand (PropagatorResult newRow, процессор TableChangeProcessor) в System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands (ChangeNode changeNode, компилятор UpdateCompiler) InnerException:

public partial class Case_PHTSY
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }                 
    public int? FamilyHistoryID { get; set; } 
    public int? PersonId { get; set; }              
    public DateTime? ReportDate { get; set; }       
    public string PhysicianName { get; set; }       
    public string MRNumber { get; set; }
    public virtual  F_FamilyHistory F_FamilyHistory { get; set; }
    public virtual  Person Person { get; set; }

    public virtual ICollection<CP_ActualDischarge> CP_ActualDischarges { get; set; }
    public virtual ICollection<CP_Barrier> Barriers { get; set; }
    public virtual ICollection<CP_AgencyContact> AgencyContacts { get; set; }
    public virtual ICollection<CP_DischargeActivity> DischargeActivities { get; set; }
    public virtual ICollection<C_Role> Roles { get; set; }
    public virtual ICollection<Case_Person_RD1> Case_Person_RD1s { get; set; }
    public virtual ICollection<PHTSY_CensusCode> PHTSY_CensusCodes { get; set; }     
}

public class CP_ActualDischarge
{
    public int Id { get; set; }

    [ForeignKey("Case_PHTSY")]
    public int Case_PHTSYId{ get; set; }

    ...

    public virtual Case_PHTSY Case_PHTSY { get; set; }
}

public partial class CP_Barrier 
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } 

    public int? Case_PHTSYId { get; set; }

   ...

    public virtual  Case_PHTSY Case_PHTSY { get; set; }

}


public partial class CP_AgencyContact 
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } 

    public int Case_PHTSYId { get; set; }               
    ...

    public virtual  Case_PHTSY Case_PHTSY { get; set; }

}

public partial class CP_DischargeActivity 
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } 

    public int? Case_PHTSYId { get; set; }

    ...             

    public virtual  Case_PHTSY Case_PHTSY { get; set; }

}

 public partial class C_Role
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } 

    public int? Case_PHTSYId{ get; set; }
    public virtual Case_PHTSY Case_PHTSY { get; set; }
}
* *} Тысяча двадцать-один
 public partial class Case_Person_RD1
{
    public virtual C_Role C_Role { get; set; }

    public virtual Case_PHTSY Case_PHTSY { get; set; }
}

Внешние ключи:

    ALTER TABLE [dbo].[CP_ActualDischarge]  WITH NOCHECK ADD  CONSTRAINT         [FK_CP_ActualDischarge_Case_PHTSY] FOREIGN KEY([Case_PHTSYId])
    REFERENCES [dbo].[Case_PHTSY] ([Id])
    ON DELETE CASCADE
    NOT FOR REPLICATION 
    GO
    ALTER TABLE [dbo].[CP_ActualDischarge] CHECK CONSTRAINT [FK_CP_ActualDischarge_Case_PHTSY]

    ALTER TABLE [dbo].[CP_AgencyContacts]  WITH NOCHECK ADD  CONSTRAINT         [FK_CP_AgencyContacts_Case_PHTSY] FOREIGN KEY([Case_PHTSYId])
    REFERENCES [dbo].[Case_PHTSY] ([Id])
    ON DELETE CASCADE
    NOT FOR REPLICATION 
    GO
ALTER TABLE [dbo].[CP_AgencyContacts] CHECK CONSTRAINT [FK_CP_AgencyContacts_Case_PHTSY]

    ALTER TABLE [dbo].[CP_Barriers]  WITH NOCHECK ADD  CONSTRAINT     [FK_CP_Barriers_Case_PHTSY] FOREIGN KEY([Case_PHTSYId])
REFERENCES [dbo].[Case_PHTSY] ([Id])
ON DELETE CASCADE
NOT FOR REPLICATION 
GO
ALTER TABLE [dbo].[CP_Barriers] CHECK CONSTRAINT [FK_CP_Barriers_Case_PHTSY]

ALTER TABLE [dbo].[CP_DischargeActivities]  WITH NOCHECK ADD  CONSTRAINT [FK_CP_DischargeActivities_Case_PHTSY] FOREIGN KEY([Case_PHTSYId])
REFERENCES [dbo].[Case_PHTSY] ([Id])
ON DELETE CASCADE
NOT FOR REPLICATION 
GO
ALTER TABLE [dbo].[CP_DischargeActivities] CHECK CONSTRAINT [FK_CP_DischargeActivities_Case_PHTSY]
GO


        modelBuilder.Entity<Case_PHTSY>().HasMany(c => c.AgencyContacts).WithOptional().HasForeignKey(k => k.Case_PHTSYId);
            modelBuilder.Entity<Case_PHTSY>().HasMany(c => c.Barriers).WithOptional().HasForeignKey(k => k.Case_PHTSYId);
            modelBuilder.Entity<Case_PHTSY>().HasMany(r => r.DischargeActivities).WithOptional().HasForeignKey(k => k.Case_PhstsyId);
            modelBuilder.Entity<Case_PHTSY>().HasMany(c => c.Roles).WithOptional().HasForeignKey(k => k.Case_PHTSYId);
            modelBuilder.Entity<Case_PHTSY>().HasMany(m => m.Case_Person_RD1s).WithOptional().HasForeignKey(k => k.Case_PhtsyId);
            modelBuilder.Entity<Case_PHTSY>().HasMany(o => o.DischargeActivities).WithOptional().HasForeignKey(k => k.Case_PhstsyId);
            modelBuilder.Entity<Case_PHTSY>().HasOptional(o => o.F_FamilyHistory).WithRequired();
            modelBuilder.Entity<Case_PHTSY>().HasMany(o => o.PHTSY_CensusCodes).WithOptional().HasForeignKey(k => k.Case_PHTSYId);



the primary table: 
CREATE TABLE [dbo].[Case_PHTSY](
    [Id] [int] IDENTITY(5000,1) NOT FOR REPLICATION NOT NULL,
    [FamilyHistoryID] [int] NULL,   
    [IntensityNHours] [smallint] NULL,
    [IEPRequested] [bit] NULL CONSTRAINT [DF_Case_PHTSY_IEPRequested]  DEFAULT (0),
    ...
    [Kidnet] [bit] NULL,
 CONSTRAINT [PK_Case_PHTSY] 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]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Case_PHTSY]  WITH NOCHECK ADD  CONSTRAINT [FK_Case_PHTSY_F_FamilyHistory] FOREIGN KEY([FamilyHistoryID])
REFERENCES [dbo].[F_FamilyHistory] ([FamilyHistoryID])
ON DELETE CASCADE
NOT FOR REPLICATION 
GO
ALTER TABLE [dbo].[Case_PHTSY] CHECK CONSTRAINT [FK_Case_PHTSY_F_FamilyHistory]
GO
ALTER TABLE [dbo].[Case_PHTSY]  WITH CHECK ADD  CONSTRAINT [FK_Case_PHTSY_Persons] FOREIGN KEY([CaseChildID])
REFERENCES [dbo].[Persons] ([PersonID])
GO
ALTER TABLE [dbo].[Case_PHTSY] CHECK CONSTRAINT [FK_Case_PHTSY_Persons]

CREATE TABLE [dbo].[CP_ActualDischarge](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Case_PHTSYId] [int] NOT NULL,
    [DischargeDate] [datetime] NULL,

 CONSTRAINT [PK_CP_ActualDischarge] 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]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[CP_ActualDischarge]  WITH NOCHECK ADD  CONSTRAINT [FK_CP_ActualDischarge_Case_PHTSY] FOREIGN KEY([Case_PHTSYId])
REFERENCES [dbo].[Case_PHTSY] ([Id])
ON DELETE CASCADE
NOT FOR REPLICATION 
GO
ALTER TABLE [dbo].[CP_ActualDischarge] CHECK CONSTRAINT [FK_CP_ActualDischarge_Case_PHTSY]

CREATE TABLE [dbo].[CP_AgencyContacts](
    [AgencyContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [Case_PHTSYId] [int] NOT NULL,
    [AgencyType] [int] NULL,
    [Agency] [int] NULL,
 CONSTRAINT [PK_Case_PHTSY_AgencyContacts] PRIMARY KEY CLUSTERED 
(
    [AgencyContactID] 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
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[CP_AgencyContacts]  WITH NOCHECK ADD  CONSTRAINT [FK_CP_AgencyContacts_Case_PHTSY] FOREIGN KEY([Case_PHTSYId])
REFERENCES [dbo].[Case_PHTSY] ([Id])
ON DELETE CASCADE
NOT FOR REPLICATION 
GO
ALTER TABLE [dbo].[CP_AgencyContacts] CHECK CONSTRAINT [FK_CP_AgencyContacts_Case_PHTSY]

Ответы [ 3 ]

2 голосов
/ 01 августа 2012

У меня была такая же ошибка.В конце концов проследили это до неправильных отношений.Я связывал два основных ключа в базе данных вместо основного и внешнего.

2 голосов
/ 07 марта 2012

Это заняло еще около часа, но я пришел к решению, используя подсказку из другого ответа.Суть в том, что EntityFramework был сбит с толку по поводу некоторых отношений (или мое описание с использованием беглых выражений было).

Я, наконец, укусила пулю, очистила некоторые имена столбцов в базе данных и сделала их «обычными», то есть tableName + Id удалила мои беглые выражения, и это сработало.

Iтакже вынул составной ключ на одну таблицу, добавил поле Id и вместо этого сделал составной ключ уникальным индексом.

Надеюсь, это поможет кому-то еще.

Я также подтвердил свое подозрение, что когдапри использовании SQL Server 2008 аннотация идентификатора не требовалась.Использовалась база данных 2005 года.

[DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)]

0 голосов
/ 19 апреля 2015

Мне пришлось вручную удалить неверную ссылку в .edmx.

...