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.