Зависимое свойство в ReferentialConstraint сопоставляется со столбцом, созданным хранилищем. Столбец:

Во-первых, спасибо, что нашли время прочитать это. У меня возникли трудности с попыткой обновить базу данных с помощью 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");

Я сравнил свою проблему с другими подобными и исследовал, чтобы убедиться, что отношения внешнего ключа указаны в правильном направлении и что идентичность находится только на ПК. Когда у меня НЕ установлен явно параметр генерации данных, команда запускается для базы данных, но не работает. B / c. Я вставляю 0 в качестве ключа, а для параметра явно установлено значение OFF. Я вижу это в SQL Profiler. Когда я добавляю опцию Identity, я получаю ошибку ссылочного ограничения.

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


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

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]

person James Fleming    schedule 06.03.2012    source источник


Ответы (3)


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

person Echilon    schedule 01.08.2012

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

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

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

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

[DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)]

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

person James Fleming    schedule 07.03.2012

полная информация об ошибке находится здесь: 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, DbSet_2_2 foriegnKeyUpdater) в C: \ TFS \ CGProjects \ GOC \ SCYFIS \ PHTSY \ Dev \ src \ Datalayer \ Helpers \ EntityExtensions.cs: строка 83 в ScyfataLayercy. EntityExtensions.SaveItem [T] (T entity, DbSet_3_2 foriegnKeyUpdater) в C: \ TFS \ CGProjects \ GOC \ SCYFIS \ PHTSY \ Dev \ src \ Datalayer \ Helpers \ EntityExtensions.cs: строка 27 в Scyfis.Ocyf.DataLayer.PHC. Сохраните (модель Case_PHTSY) в C: \ TFS \ CGProjects \ GOC \ SCYFIS \ PHTSY \ Dev \ src \ Datalayer \ Custom \ Case_PHTSYRepository.cs: строка 44 в Scyfis.Ocyf.Service.Case_PHTSYService.Create (модель Case_PHTSY) в C: \ TFS \ CGProjects \ GOC \ SCYFIS \ PHTSY \ Dev \ src \ Service \ Custom \ Case_PHTSYService.cs: строка 184 InnerException: Syst em.Data.UpdateException Message = Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение. Source = System.Data.Entity StackTrace: в System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands (ChangeNode changeNode, компилятор UpdateCompiler) в System.Data.Mapping.Update.Internal.UpdateTranslator.d_ 0.MoveNext () в командах System.Linq.Enumerable.d _71_4_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.InternalCaveChanges (параметры SaveOptions) в System.Data.Entity.InternalCaveChanges (параметры SaveOptions) в System.Data.Entity.InternalCation.Inhanges (InternalContext). : System.InvalidOperationException Message = Зависимое свойство в ReferentialConstraint сопоставлено с хранилищем Электронный столбец. Столбец: «Идентификатор». Источник = System.Data.Entity StackTrace: в System.Data.Mapping. Update.Internal.UpdateCompiler.BuildSetClauses (цель DbExpressionBinding, строка PropagatorResult, PropagatorResult originalRow, процессор TableChangeProcessor, логическое значение insertMode, Dictionary`2 и outputIdentifiers, DbExpression и возвращение, Boolean & rowMustBendTouched.UnderBinding (свойство newRow, процессор TableChangeProcessor) в System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands (ChangeNode changeNode, компилятор UpdateCompiler) InnerException:

person Sarah    schedule 19.04.2015