Thuộc tính phụ thuộc trong ReferentialConstraint được ánh xạ tới cột do cửa hàng tạo


98

Tôi gặp lỗi này khi ghi vào cơ sở dữ liệu:

Thuộc tính phụ thuộc trong ReferentialConstraint được ánh xạ tới cột do cửa hàng tạo. Cột: '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;
    }

Lược đồ là:

nhập mô tả hình ảnh ở đây

Câu trả lời:


180

Có thể bạn đã xác định mối quan hệ cột không hợp lệ giữa các bảng của mình không? các cột khác nhau và một cột được đặt làm số tự động.

Nó đã xảy ra với tôi.


55
Tôi đã nhầm lẫn tạo một trong các khóa ngoại của mình thành Identity (tự động gia tăng). Đây là lỗi tôi nhận được.
jocull

3
Doh! Tôi đã để phần khóa ngoài của mối quan hệ làm phần mặc định do SQL Server 2008 Management Studio cung cấp, đây là trường khóa chính của bảng con, không phải cột tôi đã tạo để chứa giá trị khóa ngoài.
tên cướp

12
Nếu bạn kiểm tra ngoại lệ trong cửa sổ Quick Watch (tức là (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries), bạn có thể xem bảng nào chứa khóa chính đang được tham chiếu.
Cᴏʀʏ

17
Sẽ không tuyệt nếu các thông báo lỗi EF chỉ nêu vấn đề là gì thay vì phun ra gobbledy-gook?
AR

Tôi đã sử dụng truy vấn này để xem tất cả các mối quan hệ trong một chế độ xem stackoverflow.com/questions/8094156/…
Dave

47

Lỗi này nói rằng bạn đang sử dụng quan hệ không được hỗ trợ hoặc bạn có lỗi trong ánh xạ của mình. Mã của bạn có lẽ hoàn toàn không liên quan đến lỗi.

Lỗi có nghĩa là bạn có một số mối quan hệ giữa các thực thể mà thuộc tính khóa ngoại trong thực thể phụ thuộc được xác định là cửa hàng tạo. Lưu trữ các thuộc tính được tạo ra được điền vào cơ sở dữ liệu. EF không hỗ trợ các thuộc tính được tạo từ cửa hàng dưới dạng khóa ngoại (cũng như các thuộc tính được tính toán trong khóa chính).


2
tôi có thể thêm hàng trong máy chủ sql với cùng một thông tin. khi bạn nói Store Generated, bạn có thể cho một ví dụ không?
Vua xứ Wales

1
EF không phải là SQL Server. Nó có hạn chế riêng của nó. Chỉ cần tìm nơi bạn sử dụng bất kỳ thuộc tính FK nào do DB tạo ra được gọi PaymentIDvà xử lý nó.
Ladislav Mrnka

được rồi, chúng tôi có một bảng thanh toán tiền sử dụng có payId làm khóa ngoại, tôi có cần thêm hàng vào đó không?
Vua xứ Wales

Nó không phải là về thêm hàng mà là về định nghĩa của cột. Làm thế nào để bạn đặt cột đó?
Ladislav Mrnka

vừa nhấp vào mô hình mối quan hệ trong studio trực quan và tôi nhận được Tên 'Thanh toán' không thể được sử dụng trong loại 'Thanh toán'. tên thành viên không được giống với loại bao quanh của chúng. Bất cứ ý tưởng
Welsh Vua

8

Tôi đã từng gặp vấn đề tương tự. Dựa trên các câu trả lời được cung cấp ở đây, tôi đã có thể theo dõi và giải quyết nó, nhưng tôi đã gặp một vấn đề kỳ lạ được mô tả bên dưới - nó có thể giúp ích cho ai đó trong tương lai.

Trên các bảng phụ thuộc của tôi, các cột Khóa ngoại đã được đặt thành StoreGeneratedPattern = "Identity". Tôi đã phải thay đổi nó thành "Không". Thật không may, làm như vậy bên trong nhà thiết kế không hoạt động chút nào.

Tôi đã xem xét XML do nhà thiết kế tạo (SSDL) và các thuộc tính này vẫn ở đó nên tôi đã xóa chúng theo cách thủ công. Tôi cũng phải sửa các cột trên cơ sở dữ liệu (xóa Identity (1,1) khỏi TẠO BẢNG SQL)

Sau đó, vấn đề đã biến mất.


Cảm ơn cho mẹo này. Việc thay đổi trường trong trình thiết kế từ Identity thành None đã thay đổi trường này ở một nơi trong EDMX, nhưng không thay đổi trường này ở một nơi khác, vì vậy tôi vẫn gặp lỗi cho đến khi tôi tự chỉnh sửa tệp EDMX. Thật không may, EntityFramework sau đó đã nổi điên và cố gắng chèn lại các thực thể có liên quan trong các bảng khác, nhưng vẫn có ích trong việc bỏ qua thông báo lỗi đó.
FTWinston

6

Tôi đã gặp vấn đề tương tự và sau một số tìm hiểu về thiết kế bảng trong máy chủ sql, tôi nhận thấy rằng tôi đã đặt nhầm khóa chính của bảng cũng thành khóa ngoại.

quy trình thiết kế bảng máy chủ sql

Trong hình ảnh này, bạn có thể thấy rằng JobID là khóa chính của bảng nhưng cũng nhầm lẫn với khóa ngoại.


2

Sự cố của tôi là do xác định thừa khóa Chính trong cấu hình.

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");

Xóa dòng này

.HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)


Ví dụ http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

Điều này đủ để xác định mối quan hệ

// 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

Kiểm tra lại mối quan hệ giữa Thanh toán và các bảng / thực thể khác. Bao gồm những cái không nên chứa PaymentId vì đó là nơi có nhiều khả năng vấn đề đang ẩn.

Khi tạo khóa ngoại trong SQL Server Management Studio, khóa chính được đặt mặc định và mặc định này được hoàn nguyên khi bảng mẹ được thay đổi, vì vậy hãy cẩn thận thay đổi các giá trị theo đúng thứ tự trong cửa sổ "Bảng và Cột".

Ngoài ra, sau khi bạn đã khắc phục mối quan hệ có vấn đề, rất có thể một thao tác "Làm mới" đơn giản trên mô hình sẽ không loại bỏ chính xác mối quan hệ có lỗi khỏi mô hình và bạn sẽ gặp phải lỗi tương tự ngay cả sau khi " sửa chữa ", vì vậy hãy tự làm điều này trong mô hình trước khi thực hiện làm mới. (Tôi thấy điều này thật khó khăn.)


1

Nếu bạn đã kiểm tra các mối quan hệ của mình và ở đó tốt.

Xóa bảng trong edmx và sau đó cập nhật từ cơ sở dữ liệu. Điều này sẽ giúp bạn thực hiện cập nhật theo cách thủ công.


Thực sự cảm ơn lời khuyên của bạn, tôi đã dành 1 giờ để xác thực cơ sở dữ liệu của mình, nhưng sau khi gỡ bỏ và cập nhật, mọi thứ đều ổn.
Tấn Nguyên

1

Đối với tôi, đó là một khóa ngoại được đặt sai trong bảng nhưng ngay cả sau khi thay đổi bảng để sửa nó, nó vẫn không hoạt động. Bạn cần cập nhật các tệp EDMX (và không đủ để "làm mới" bảng từ mô hình, bạn cần phải xóa và thêm lại bảng trong mô hình).


1

Ngoài câu trả lời được chấp nhận, nếu bạn đang sử dụng trình tạo EF Reverse POCO hoặc một số công cụ khác tạo POCO của bạn, hãy đảm bảo bạn tạo lại chúng!


Đừng bao giờ quên chạy lại Công cụ T4 tùy chỉnh của bạn (giữ POCO) sau khi sửa đổi trình tạo mô hình DB-first EF bên ngoài của bạn (giữ các ngữ cảnh) ... BAO GIỜ! XD (cũng có thể đã trở nên điên rồ -.- ')
Shockwaver

0

Trong trường hợp của tôi, vấn đề là do có mối quan hệ 1-1 hai chiều:

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

Tôi chỉ cần loại bỏ một trong hai khóa ngoại (dù sao cũng không cần thiết).


0

Trong trường hợp của tôi, điều đó đơn giản là tôi không có quyền được đặt đúng trên cơ sở dữ liệu. Tôi đã chỉ đọc tập hợp và khung thực thể đã gây cho tôi lỗi ReferentialConstraint khiến tôi thất vọng. Đã thêm quyền ghi bổ sung và tất cả đều tốt.


0

Trong trường hợp của tôi, tôi có thuộc tính Tạo cơ sở dữ liệu và thuộc tính điều hướng ForeignKey được thiết lập để tham chiếu bảng liên quan 1 đến 1.

Đây không phải là thứ tôi có thể xóa, tôi cần có thể đặt cả khóa chính của thực thể thành Cơ sở dữ liệu được tạo VÀ tôi cần có thể tham chiếu bảng 1 đến 1 làm thuộc tính điều hướng.

Không chắc liệu điều này có giống với những người khác hay không, nhưng sự cố này chỉ xuất hiện khi tạo một thực thể mới, việc đọc hoặc chỉnh sửa các thực thể hiện có không cho thấy vấn đề, vì vậy tôi đã giải quyết vấn đề bằng cách tạo phiên bản kế thừa của Ngữ cảnh và sử dụng phương pháp Fluent để tắt thuộc tính điều hướng khi tạo.

Vì vậy, thực thể ban đầu của tôi trông như thế này:

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


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

Vì vậy, tôi đã tạo một bối cảnh kế thừa đặc biệt trông như thế này:

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

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

        }
    }

và sau đó thay đổi mã đã tạo thực thể mới để làm cho người dùng loại ngữ cảnh mới

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

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

Hy vọng điều này sẽ giúp ai đó


0

Trong trường hợp của tôi trường Id wich FK chỉ trong Entity Framework, propierty "StoreGeneratedPattern" được đặt là "Itentity" thay vì "None"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.