ReferentialConstraint의 종속 속성은 저장소 생성 열에 매핑됩니다.


98

데이터베이스에 쓸 때이 오류가 발생합니다.

ReferentialConstraint의 종속 속성은 저장소 생성 열에 매핑됩니다. 열 : 'PaymentId'.

public bool PayForItem(int terminalId, double paymentAmount, 
      eNums.MasterCategoryEnum  mastercategoryEnum, int CategoryId, int CategoryItemId)
    {

        using (var dbEntities = new DatabaseAccess.Schema.EntityModel())
        {
            int pinnumber = 0;
            long pinid = 1; //getPinId(terminalId,ref pinnumber) ;
            var payment = new DatabaseAccess.Schema.Payment();
            payment.CategoryId = CategoryId;
            payment.ItemCategoryId = CategoryItemId;
            payment.PaymentAmount = (decimal)paymentAmount;
            payment.TerminalId = terminalId;
            payment.PinId = pinid;

            payment.HSBCResponseCode = "";
            payment.DateActivated = DateTime.Now;
            payment.PaymentString = "Payment";
            payment.PromotionalOfferId = 1;
            payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid;

            //payment.PaymentId = 1;

            dbEntities.AddToPayments(payment);
            dbEntities.SaveChanges();
        }
        return true;
    }

스키마는 다음과 같습니다.

여기에 이미지 설명 입력

답변:


180

테이블간에 잘못된 열 관계를 정의했을 수 있습니까? 다른 열과 하나는 자동 숫자로 설정되었습니다.

나에게 일어난 일입니다.


55
실수로 외래 키 중 하나를 ID (자동 증가)로 만들었습니다. 이것은 내가 얻은 오류입니다.
— jocull

3
도! 외래 키 값을 포함하기 위해 만든 열이 아니라 자식 테이블의 기본 키 필드 인 SQL Server 2008 Management Studio에서 제공하는 기본값으로 관계의 외래 키 부분을 그대로 두었습니다.
— robaker 2012 년

12
Quick Watch 창 (예 :)에서 예외를 검사하면 (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries참조되는 기본 키가 포함 된 테이블을 확인할 수 있습니다.
— Cᴏʀʏ 2014-10-28

17
EF 오류 메시지에 문제가 뭔지 뱉어내는 대신 뱉어내는 것이 아니라면 멋지지 않을까요?
— AR.

이 쿼리를 사용하여 하나의 뷰에서 모든 관계를
— Dave

47

이 오류는 지원되지 않는 관계를 사용 중이거나 매핑에 오류가 있음을 나타냅니다. 귀하의 코드는 아마도 오류와 절대적으로 관련이 없습니다.

이 오류는 종속 엔터티의 외래 키 속성이 저장소 생성으로 정의 된 엔터티간에 일부 관계가 있음을 의미합니다. 저장소 생성 속성은 데이터베이스에 채워집니다. EF는 저장소 생성 속성을 외래 키 (기본 키의 계산 된 속성)로 지원하지 않습니다.


2
동일한 정보로 SQL Server에 행을 추가 할 수 있습니다. Store Generated라고 말하면 예를 들어 줄 수 있습니까?
— Welsh King

1
EF는 SQL Server가 아닙니다. 자체 한계가 있습니다. DB 생성 FK 속성을 사용하는 곳을 찾아서 PaymentID처리하십시오.
— Ladislav Mrnka 2011 년

외래 키로 paymentId가있는 paymenthistory 테이블이 있습니다. 행을 추가해야합니까?
— Welsh King

행을 추가하는 것이 아니라 열의 정의에 관한 것입니다. 그 열을 어떻게 설정합니까?
— Ladislav Mrnka 2011-06-17

Visual Studio에서 관계 모델을 클릭하고 'Payment'라는 이름을 얻는 것은 'Payment'유형에서 사용할 수 없습니다. 멤버 이름은 둘러싸는 유형과 같을 수 없습니다. 어떤 아이디어
— 웨일스어 왕

8

나는 같은 문제가 있었다. 여기에 제공된 답변을 바탕으로 추적하고 해결할 수 있었지만 아래에 설명 된 이상한 문제가있었습니다. 나중에 누군가에게 도움이 될 수 있습니다.

내 종속 테이블에서 외래 키 열이 StoreGeneratedPattern = "Identity"로 설정되었습니다. "없음"으로 변경해야했습니다. 불행히도 디자이너 내부에서 그렇게하는 것은 전혀 작동하지 않았습니다.

디자이너가 생성 한 XML (SSDL)을 살펴 보았는데 이러한 속성이 여전히 존재하므로 수동으로 제거했습니다. 또한 데이터베이스의 열을 수정해야했습니다 (CREATE TABLE SQL에서 Identity (1,1) 제거)

그 후 문제가 사라졌습니다.


이 팁에 감사드립니다. 디자이너의 필드를 Identity에서 None으로 변경하면 EDMX의 한 곳에서 변경되었지만 다른 곳에서는 변경되지 않았으므로 EDMX 파일을 직접 편집 할 때까지 여전히 오류가 발생했습니다. 불행히도 EntityFramework는 화가 나서 다른 테이블에 관련 엔티티를 다시 삽입하려고 시도했지만 여전히 해당 오류 메시지를 우회하는 데 도움이되었습니다.
— FTWinston

6

나는 같은 문제가 있었고 SQL Server에서 테이블 디자인을 파헤친 후 실수로 테이블의 기본 키를 외래 키로 설정했다는 사실을 발견했습니다.

SQL 서버 테이블 디자인 흐름

이 이미지에서 JobID가 테이블의 기본 키이지만 실수로 외래 키임을 알 수 있습니다.


2

내 문제는 구성에서 기본 키의 중복 정의로 인해 발생했습니다.

this
   .Property(p => p.Id)
   .HasColumnName(@"id")
   .IsRequired()
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) // this is redundant when you want to configure a One-to-Zero-or-One relationship
   .HasColumnType("int");

이 줄 제거

.HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)


예 http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

관계를 정의하기에 충분합니다.

// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address) // Mark Address property optional in Student entity
            .WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student

1

Payment와 다른 테이블 / 엔터티 간의 관계를 다시 확인하십시오. 문제가 숨겨져있을 가능성이 가장 높기 때문에 PaymentId를 포함하지 않아야하는 항목을 포함합니다.

SQL Server Management Studio에서 외래 키를 만들 때 기본 키가 기본값으로 설정되고 상위 테이블이 변경되면이 기본값이 되돌려 지므로 "테이블 및 열"창에서 올바른 순서로 값을 변경해야합니다.

또한 문제가있는 관계를 수정 한 후에는 모델에 대한 간단한 "새로 고침"이 모델에서 잘못된 관계를 올바르게 제거하지 못할 가능성이 높으며 " 수정 " 후에도 동일한 오류가 발생합니다 . 따라서 새로 고침을 수행하기 전에 모델에서 직접 수행하십시오. (나는 이것을 어려운 방법으로 발견했습니다.)


1

당신이 당신의 관계를 확인하고 거기에서 좋은 경우.

edmx에서 테이블을 삭제 한 다음 데이터베이스에서 업데이트하십시오. 이렇게하면 수동으로 업데이트 할 필요가 없습니다.


조언을 해주셔서 감사합니다. 데이터베이스를 확인하는 데 1 시간이 걸렸지 만 제거하고 업데이트 한 후에는 모든 것이 정상입니다.
— Tấn Nguyên

1

나를 위해 그것은 테이블에 잘못 배치 된 외래 키 였지만 테이블을 수정하여 수정 한 후에도 여전히 작동하지 않았습니다. EDMX 파일을 업데이트해야합니다 (모델에서 테이블을 "새로 고침"하기에 충분하지 않습니다. 모델에서 테이블을 제거하고 다시 추가해야합니다).


1

허용 대답 외에도, EF 역 POCO 발생기 또는 POCO의 생성 다른 도구를 사용하여 당신이 있는지 확인하는 경우 재생 을!


외부 DB 우선 EF 모델 생성기 (컨텍스트 보유)를 수정 한 후 사용자 지정 T4 도구 (POCO 보유)를 다시 실행하는 것을 잊지 마십시오. XD (미쳤을 수도 있습니다 -.- ')
— Shockwaver

0

제 경우에는 양방향 1-1 관계로 인해 문제가 발생했습니다.

class Foo{
[Key]
Id
[ForeignKey]
BarId
...
}
class Bar{
[Key]
Id
[ForeignKey]
FooId
...
}

두 개의 외래 키 중 하나를 제거해야했습니다 (어쨌든 필요하지 않음).


0

제 경우에는 단순히 데이터베이스에 대한 권한이 제대로 설정되지 않았기 때문입니다. 나는 읽기 전용 세트를 가지고 있었고 Entity 프레임 워크는 나를 버리는 ReferentialConstraint 오류를 제공했습니다. 추가 쓰기 권한이 추가되었으며 모두 잘되었습니다.


0

제 경우에는 Database Generated 속성과 1 대 1 관련 테이블을 참조하도록 설정된 ForeignKey 탐색 속성이 있습니다.

이것은 내가 제거 할 수있는 것이 아니었고, 엔터티의 기본 키를 Database Generated로 설정할 수 있어야하고 탐색 속성으로 일대일 테이블을 참조 할 수 있어야했습니다.

이것이 다른 사람들과 동일한 지 확실하지 않지만이 문제는 새 엔티티를 만들 때만 나타나고 기존 엔티티를 읽거나 편집해도 문제가 나타나지 않았으므로 상속 된 버전의 컨텍스트를 만들고 사용하여 문제를 해결했습니다. Fluent 메서드를 사용하여 만들 때 탐색 속성을 끕니다.

그래서 내 원래 엔티티는 다음과 같습니다.

public partial class MyEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid id{ get; set; }


    // Navigation
    [ForeignKey("id")]
    public PathEntity Path { get; set; }
}

그래서 다음과 같은 특별한 상속 된 컨텍스트를 만들었습니다.

    private class _navPropInhibitingContext : EF.ApplicationDBContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<MyEntity>()
                .Ignore(e => e.Path);

        }
    }

그런 다음 새 컨텍스트 유형의 사용자를 만들기 위해 새 엔터티를 만든 코드를 변경했습니다.

    using (var specialContext = new _navPropInhibitingContext())
    {
        var dbModel = new MyEntity() 
        {
            ...
        };

        specialContext.MyEntity.Add(dbModel);
        await specialContext.SaveChangesAsync();
    }

이것이 누군가에게 도움이되기를 바랍니다.


0

필자의 경우 Entity Framework에서 FK가있는 Id 필드의 경우 속성 "StoreGeneratedPattern"이 "None"대신 "Itentity"로 설정되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.