Không thể cập nhật Entityset - vì nó có DefiningQuery và không tồn tại phần tử <UpdateFunction>


534

Tôi đang sử dụng Entity Framework 1 với .net 3.5.

Tôi đang làm một cái gì đó đơn giản như thế này:

var roomDetails = context.Rooms.ToList();

foreach (var room in roomDetails)
{        
   room.LastUpdated = DateTime.Now;
}

Tôi nhận được lỗi này khi tôi cố gắng làm:

 context.SaveChanges();

Tôi nhận được lỗi:

Không thể cập nhật Entityset - vì nó có DefiningQuery và không có phần tử <UpdateFunction> nào tồn tại trong phần tử <ModificationFunctionMapping> để hỗ trợ hoạt động hiện tại.

Tôi đang thực hiện nhiều cập nhật về bối cảnh và không gặp vấn đề gì, chỉ khi tôi cố gắng cập nhật thực thể cụ thể này.

Tất cả các tìm kiếm của tôi cho thấy điều tương tự, rằng không có khóa chính nào được khai báo trên thực thể mà tôi đang cố cập nhật. Nhưng than ôi, tôi có một khóa chính được khai báo ...


61
Tôi đã mắc lỗi, không có khóa chính được đặt trên bàn, cảm ơn vì thời gian của bạn! Xin lỗi vì sự bất tiện!
iKode

1
Mới xảy ra với tôi - có lẽ đã tạo ra 1000 bảng với các khóa chính và quên một bảng - thông báo ngoại lệ không giúp được gì nhiều
Peter Munnings

1
thông minh. thực sự tôi quên thêm khóa chính vào Bảng. Hãy cố gắng cẩn thận)
AEMLoviji

Câu trả lời:


1024

Nó thường xảy ra vì một trong những lý do sau:

  • Bộ thực thể được ánh xạ từ chế độ xem Cơ sở dữ liệu
  • Một truy vấn cơ sở dữ liệu tùy chỉnh
  • Bảng cơ sở dữ liệu không có khóa chính

Sau khi làm như vậy, bạn vẫn có thể cần cập nhật trong trình thiết kế Entity Framework (hoặc thay thế xóa thực thể và sau đó thêm nó) trước khi bạn ngừng gặp lỗi.


2
Đảm bảo cũng thay đổi cửa hàng: Schema thành Schema cho Entityset đó, nếu bạn vẫn gặp sự cố.
Geoff

53
Sau đó xóa và tạo lại thực thể vì bản cập nhật không hoạt động ngay trong trình thiết kế EF.
Suncat2000

48
PK là câu trả lời. Cảm ơn!
nrod

1
Cập nhật trong trình thiết kế EF hoạt động tốt với tôi sau khi thêm Khóa chính vào cơ sở dữ liệu. Sử dụng EF 5.0 và .net 4.0
StillLearnin

1
Tương tự ở đây! Thx ... đã phải xóa bảng và thêm lại vào EF để lấy nó
ajzeffer

90

Chỉ cần thêm một khóa chính vào bảng. Đó là nó. Vấn đề được giải quyết.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

13
và đừng quên nhấp vào "Cập nhật mô hình từ cơ sở dữ liệu" trên tệp .edmx của bạn
Bashar Abu Shamaa

@BasharAbuShamaa câu trả lời này không hợp lệ nếu không có chi tiết đó.
Kehlan Krumme

66

Đây là trường hợp đối với tôi. Đơn giản chỉ cần loại bỏ dẫn đến một lỗi khác. Tôi đã làm theo các bước của bài này ngoại trừ bài cuối cùng. Để thuận tiện cho bạn, tôi đã sao chép 4 bước từ bài đăng mà tôi đã theo dõi để giải quyết vấn đề như sau:

  1. Nhấp chuột phải vào tệp edmx, chọn Mở bằng, trình soạn thảo XML
  2. Xác định vị trí thực thể trong phần tử edmx: StorageModels
  3. Xóa hoàn toàn DefiningQuery
  4. Đổi tên store:Schema="dbo"thành Schema="dbo"(nếu không, mã sẽ tạo ra lỗi cho biết tên không hợp lệ)

Cảm ơn bạn rất nhiều - đây chính xác là những gì đã khắc phục vấn đề của tôi. Khá đáng lo ngại rằng điều này đã không được sửa trong EF. Và, khá tuyệt vời khi bạn tìm ra điều này!
Xe đạp Dave

Tôi đã cố gắng xóa thực thể và thêm lại nó. Biên dịch lại. Làm sạch. Không có gì làm việc cho tôi ngoại trừ điều này.
vintastic

1
Điều này đã giải quyết vấn đề của tôi nhưng tôi không biết làm thế nào bạn đưa ra câu trả lời và tại sao đề xuất của bạn giải quyết vấn đề.
swcraft

Điều gì xảy ra nếu bạn cần cập nhật mô hình cơ sở dữ liệu? Tôi đã thực hiện "Mô hình cập nhật từ cơ sở dữ liệu" và nó khiến mô hình của tôi hoàn toàn không sử dụng được. Tôi phải hoàn tác và bắt đầu lại từ đầu. Nếu có một cách xung quanh này?
Gary

Đó là một vấn đề thực sự kỳ lạ. Có bất kỳ thông tin về cách vấn đề này xảy ra để tránh nó? Tuy nhiên - nó đã giúp
r3dst0rm

41

Chỉ cần lưu ý rằng có thể Thực thể của bạn khóa chính nhưng bảng trong cơ sở dữ liệu của bạn không có khóa chính .


1
Làm thế nào để khắc phục, nếu chúng ta không thể thay đổi bảng cơ sở dữ liệu?
Kai Hartmann

Nếu bạn có thể thay đổi bảng DB để có khóa chính thì trình tạo mã sẽ ngừng mắc lỗi tương tự, việc xóa khóa khỏi EF sẽ gây ra nhiều vấn đề khác.
Chris Schaller

30

CẬP NHẬT: Gần đây tôi đã nhận được một vài sự ủng hộ, vì vậy tôi đoán rằng tôi sẽ cho mọi người biết những lời khuyên tôi đưa ra dưới đây không phải là tốt nhất. Vì ban đầu tôi bắt đầu làm quen với việc thực hiện Entity Framework trên các cơ sở dữ liệu không khóa cũ, tôi đã nhận ra rằng điều tốt nhất bạn có thể làm bởi FAR là làm điều đó bằng cách đảo ngược mã trước. Có một vài bài viết hay về cách làm điều này. Chỉ cần theo dõi họ và sau đó khi bạn muốn thêm khóa vào đó, hãy sử dụng chú thích dữ liệu để "giả" khóa.

Chẳng hạn, giả sử tôi biết bảng của mình Orders, trong khi nó không có khóa chính, được đảm bảo chỉ có một số thứ tự cho mỗi khách hàng. Vì đó là hai cột đầu tiên trên bảng, nên tôi đã thiết lập mã lớp đầu tiên trông như thế này:

    [Key, Column(Order = 0)]
    public Int32? OrderNumber { get; set; }

    [Key, Column(Order = 1)]
    public String Customer { get; set; }

Bằng cách này, về cơ bản, bạn đã giả mạo EF tin rằng có một cụm được tạo thành từ OrderNumber và Khách hàng. Điều này sẽ cho phép bạn thực hiện chèn, cập nhật, vv trên bảng không cần chìa khóa của bạn.

Nếu bạn không quá quen thuộc với việc thực hiện mã ngược lại trước tiên, hãy đi và tìm một hướng dẫn tốt về Entity Framework Code trước. Sau đó, đi tìm một cái trên Reverse Code First (đang thực hiện Code First với cơ sở dữ liệu hiện có). Sau đó chỉ cần quay lại đây và xem lại lời khuyên chính của tôi. :)

Câu trả lời gốc :

Đầu tiên: như những người khác đã nói, tùy chọn tốt nhất là thêm khóa chính vào bảng. Dấu chấm. Nếu bạn có thể làm điều này, không đọc thêm.

Nhưng nếu bạn không thể, hoặc chỉ ghét chính mình, có một cách để làm điều đó mà không cần khóa chính.

Trong trường hợp của tôi, tôi đã làm việc với một hệ thống cũ (các tệp phẳng ban đầu trên AS400 được chuyển sang Access và sau đó được chuyển sang T-SQL). Thế là tôi phải tìm cách. Đây là giải pháp của tôi. Phần sau đây hoạt động với tôi bằng cách sử dụng Entity Framework 6.0 (mới nhất trên NuGet khi viết bài này).

  1. Nhấp chuột phải vào tệp .edmx của bạn trong Solution Explorer. Chọn "Mở bằng ..." và sau đó chọn "Trình soạn thảo XML (Văn bản)". Chúng tôi sẽ chỉnh sửa bằng tay mã được tạo tự động ở đây.

  2. Hãy tìm một dòng như thế này:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">

  3. Tẩy store:Name="table_name" từ cuối.

  4. Thay đổi store:Schema="whatever" thànhSchema="whatever"

  5. Nhìn bên dưới dòng đó và tìm <DefiningQuery> thẻ. Nó sẽ có một tuyên bố chọn ol 'lớn trong đó. Xóa thẻ và nội dung của nó.

  6. Bây giờ dòng của bạn sẽ trông giống như thế này:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />

  7. Chúng tôi có một cái gì đó khác để thay đổi. Đi qua tập tin của bạn và tìm thấy điều này:
    <EntityType Name="table_name">

  8. Gần đó có thể bạn sẽ thấy một số văn bản nhận xét cảnh báo bạn rằng nó không có khóa chính được xác định, vì vậy khóa đã được suy ra và định nghĩa là bảng / chế độ chỉ đọc. Bạn có thể để nó hoặc xóa nó. Tôi đã xóa nó.

  9. Dưới đây là <Key>thẻ. Đây là những gì Entity Framework sẽ sử dụng để thực hiện chèn / cập nhật / xóa. VÌ VẬY, BẠN NÊN LÀM QUYỀN NÀY. Thuộc tính (hoặc thuộc tính) trong thẻ đó cần chỉ ra một hàng có thể nhận dạng duy nhất. Chẳng hạn, giả sử tôi biết bảng của mình orders, trong khi nó không có khóa chính, được đảm bảo chỉ có một số thứ tự cho mỗi khách hàng.

Vì vậy, của tôi trông như:

<EntityType Name="table_name">
              <Key>
                <PropertyRef Name="order_numbers" />
                <PropertyRef Name="customer_name" />
              </Key>

Nghiêm túc, đừng làm điều này sai. Hãy nói rằng mặc dù không bao giờ có sự trùng lặp, nhưng bằng cách nào đó, hai hàng vào hệ thống của tôi có cùng số thứ tự và tên khách hàng. Whooops! Đó là những gì tôi nhận được khi không sử dụng chìa khóa! Vì vậy, tôi sử dụng Entity Framework để xóa một. Bởi vì tôi biết bản sao là thứ tự duy nhất được đưa vào ngày hôm nay, nên tôi làm điều này:

var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today);
myModel.orders.Remove(duplicateOrder);

Đoán xem cái gì? Tôi chỉ xóa cả bản sao VÀ bản gốc! Đó là bởi vì tôi đã nói với Entity Framework rằng order_number / cutomer_name là khóa chính của tôi. Vì vậy, khi tôi nói với nó để loại bỏ trùng lặp, những gì nó đã làm trong nền là một cái gì đó như:

DELETE FROM orders
WHERE order_number = (duplicateOrder's order number)
AND customer_name = (duplicateOrder's customer name)

Và với lời cảnh báo đó ... bây giờ bạn nên đi thật tốt!


Tìm thấy câu trả lời này sau khi tìm ra giải pháp tương tự cho vấn đề. Chắc chắn là câu trả lời đúng! Chỉ xác định khóa chính như được đề cập trong các câu trả lời khác sẽ không giúp ích trong nhiều trường hợp.
Obl Tobl

19

Điều này cũng có thể xảy ra nếu mô hình dữ liệu đã lỗi thời.

Hy vọng điều này sẽ cứu người khác thất vọng :)


6

Tôi đã nhận được thông báo lỗi tương tự, nhưng trong kịch bản của tôi, tôi đã cố gắng cập nhật các thực thể xuất phát từ mối quan hệ nhiều-nhiều bằng cách sử dụng một PJT (Bảng tham gia thuần túy).

Từ việc đọc các bài đăng khác, tôi nghĩ rằng tôi có thể sửa nó bằng cách thêm một trường PK bổ sung vào bảng tham gia ... Tuy nhiên, nếu bạn thêm một cột PK vào bảng tham gia, nó không còn là một PJT nữa và bạn sẽ mất tất cả lợi thế khung thực thể như ánh xạ mối quan hệ tự động giữa các thực thể.

Vì vậy, giải pháp trong trường hợp của tôi là thay đổi bảng tham gia trên DB để tạo PK bao gồm cả HAI cột ID nước ngoài.


Đây có phải là cách tạo EDMX luôn hoạt động? Tôi đã từng làm việc với Code First mà không yêu cầu PK trên bảng tham gia thuần túy.
Michael Hornfeck

4

một lỗi có thể xảy ra, nếu bảng của bạn không có khóa chính, trong trường hợp này, bảng là "chỉ đọc" và lệnh db.SaveChanges () sẽ luôn có lỗi


4

Đặt Khóa chính sau đó lưu Bảng và Làm mới, sau đó chuyển đến Xóa bảng Model.edmx và nhận lại.


3

Vì vậy, nó đúng, chỉ cần thêm một khóa chính

Lưu ý: hãy chắc chắn rằng khi bạn cập nhật sơ đồ EF của mình từ cơ sở dữ liệu mà bạn đang trỏ đến đúng cơ sở dữ liệu, trong trường hợp của tôi, chuỗi kết nối đã trỏ đến một DB cục bộ thay vì Dev DB cập nhật, học sinh tôi biết lỗi, nhưng tôi muốn đăng bài này vì nó có thể rất bực bội nếu bạn tin rằng bạn đã thêm khóa chính và bạn vẫn nhận được lỗi tương tự


2

Tôi gặp vấn đề tương tự. Như chủ đề này đã nói, bảng của tôi không có PK, vì vậy tôi đã đặt PK và chạy mã. Nhưng không may lỗi lại đến. Những gì tôi đã làm tiếp theo là xóa kết nối DB (xóa tệp .edmx trong thư mục Model của Solution Explorer) và tạo lại nó. Lỗi đi sau đó. Cảm ơn mọi người đã chia sẻ kinh nghiệm của bạn. Nó tiết kiệm rất nhiều thời gian.


1

Tôi đã gặp vấn đề này bởi vì tôi đang tạo EDMX của mình từ cơ sở dữ liệu hiện có (được thiết kế bởi người khác và tôi sử dụng thuật ngữ 'được thiết kế' một cách lỏng lẻo ở đây).

Hóa ra cái bàn không có chìa khóa gì. EF đã tạo ra mô hình với nhiều khóa. Tôi đã phải thêm khóa chính vào bảng db trong SQL và sau đó cập nhật mô hình của mình trong VS.

Điều đó đã sửa nó cho tôi.


1

Đây không phải là một câu trả lời mới nhưng sẽ giúp ai đó không chắc chắn cách đặt khóa chính cho bảng của họ. Sử dụng điều này trong một truy vấn mới và chạy. Điều này sẽ đặt cột UniqueID làm khóa chính.

USE [YourDatabaseName]
GO

Alter table  [dbo].[YourTableNname]
Add Constraint PK_YourTableName_UniqueID Primary Key Clustered (UniqueID);
GO

1

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

Trong trường hợp của tôi, quên xác định Khóa chính cho Bảng. Vì vậy, chỉ định như hiển thị trong Ảnh và Làm mới bảng của bạn từ "Cập nhật mô hình từ Cơ sở dữ liệu" từ tệp .edmx. Hy vọng nó sẽ giúp !!!


0

Thêm khóa chính làm việc cho tôi quá!

Khi đã xong, đây là cách cập nhật mô hình dữ liệu mà không xóa nó -

Nhấp chuột phải vào trang Nhà thiết kế thực thể edmx và 'Mô hình cập nhật từ cơ sở dữ liệu'.


0

Thật không may, tôi đã có cùng một vấn đề, thật không may, việc thêm khóa chính không giải quyết được vấn đề. Vì vậy, đây là cách tôi giải quyết của tôi:

  1. Hãy chắc chắn rằng bạn có một cái primary keytrên bàn để tôi thay đổi bảng của mình và thêm khóa chính.
  2. Delete the ADO.NET Entity Data Model (tệp edmx) nơi tôi sử dụng để ánh xạ và kết nối với cơ sở dữ liệu của mình.
  3. Add again a new file of ADO.NET Entity Data Model để kết nối với cơ sở dữ liệu của tôi và để ánh xạ các thuộc tính mô hình của tôi.
  4. Clean and rebuild the solution.

Vấn đề được giải quyết.


0

chỉ cần thêm khóa chính vào bảng của bạn và sau đó tạo lại EF của bạn


0

Tôi chỉ cần xóa bảng khỏi mô hình và cập nhật lại mô hình để đưa bảng trở lại. Tôi đoán khóa chính đã được tạo sau khi bảng được kéo vào mô hình.


0

Tôi gặp vấn đề này và tin rằng nó đã được gây ra bởi vì tôi đã xóa Chỉ mục chính trên bảng của mình và thay thế nó bằng một chỉ mục trên một số trường khác trong bảng.

Sau khi tôi xóa chỉ mục khóa chính và làm mới edmx, các phần chèn đã ngừng hoạt động.

Tôi làm mới bảng lên phiên bản cũ hơn, làm mới edmx và mọi thứ hoạt động trở lại.

Tôi nên lưu ý rằng khi tôi mở EDMX để khắc phục sự cố này, kiểm tra xem liệu có khóa chính được xác định không, có. Vì vậy, không có gợi ý nào ở trên giúp tôi. Nhưng làm mới chỉ mục trên khóa chính dường như hoạt động.


0

Mở tệp .edmx của bạn trong trình soạn thảo XML và sau đó xóa thẻ khỏi Thẻ và cũng thay đổi cửa hàng: Schema = "dbo" thành Schema = "dbo" và xây dựng lại giải pháp ngay bây giờ lỗi sẽ giải quyết và bạn sẽ có thể lưu dữ liệu.


0

Tôi tìm thấy câu trả lời ban đầu về việc cập nhật tệp .edmx hoạt động tốt nhất trong tình huống của tôi. Tôi chỉ không hài lòng về việc thay đổi mô hình mỗi khi nó được cập nhật từ cơ sở dữ liệu. Đó là lý do tại sao tôi đã viết một tệp Mẫu văn bản bổ sung, đó là tự động được gọi khi sau khi mô hình đã thay đổi - giống như các thực thể mới được tạo. Tôi đăng nó ở đây trong bình luận này. Để làm cho nó hoạt động, hãy đảm bảo bạn đặt tên giống như {tên mô hình} .s Something.tt và lưu trữ nó trong cùng thư mục với thư mục .edmx của bạn. Tôi đặt tên cho nó là {tên mô hình} .NonPkTables.tt. Nó không tự tạo một tệp do định nghĩa mở rộng tệp không hợp lệ trong dòng thứ hai. Hãy sử dụng.

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ output extension="/" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq"#>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\EntityFramework.dll" #>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\Microsoft.Data.Entity.Design.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Mapping" #>
<#@ import namespace="System.CodeDom" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Diagnostics" #>

<#
    string modelFileName= this.Host.TemplateFile.Split('.')[0] + ".edmx";
    string edmxPath = this.Host.ResolvePath( modelFileName );

    // MessageBox.Show( this.Host.TemplateFile + " applied." );
    var modelDoc = XDocument.Load(edmxPath);
    var root = modelDoc.Root;
    XNamespace nsEdmx = @"http://schemas.microsoft.com/ado/2009/11/edmx";
    XNamespace ns = @"http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

    var runtime = root.Elements(nsEdmx + "Runtime").First();
    var storageModels = runtime.Elements(nsEdmx + "StorageModels").First();
    XNamespace nsStore = @"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator";

    var schema = storageModels.Elements(ns + "Schema").First();
    XNamespace nsCustomAnnotation = @"http://schemas.microsoft.com/ado/2013/11/edm/customannotation";

    var entityTypes = schema.Nodes().OfType<XComment>().Where(c => c.Value.Contains("warning 6002: The table/view"));
    bool changed = false;

    foreach (var node in entityTypes)
    {
        var element = node.ElementsAfterSelf().First();
        string entityName = element.Attribute("Name").Value;

        // Find EntitySet in EntityContainer.
        var entityContainer = schema.Elements(ns + "EntityContainer").First();
        var entitySet = entityContainer.Elements(ns + "EntitySet").First(s => s.Attribute("Name").Value == entityName);

        // Change "store:Schema" attribute to "Schema" attribute.
        var attribute = entitySet.Attribute(nsStore + "Schema");

        if (attribute != null)
        {
            string schemaName = entitySet.Attribute(nsStore + "Schema").Value;
            entitySet.Attribute(nsStore + "Schema").Remove();
            entitySet.Add(new XAttribute("Schema", schemaName));
            changed |= true;
        }

        // Remove the DefiningQuery element.
        var definingQuery = entitySet.Element(ns + "DefiningQuery");

        if (definingQuery != null)
        {
            definingQuery.Remove();
            changed |= true;        
            Debug.WriteLine(string.Format("Removed defining query of EntitySet {0}.", entityName));
        }
    }

    if (changed)
        modelDoc.Save(edmxPath);
#>

-1

Tôi đã đối mặt với cùng một thông báo lỗi để chèn một bản ghi vào bảng có mối quan hệ Nhiều-Nhiều . Lược đồ cơ sở dữ liệu của tôi là:

Student (Id , Name)
Course (Code , Title),
Student-Course (Student_ID, Course_Code)

Bảng Sinh viênKhóa học có khóa chính Id và Mã tương ứng , trong khi bảng Khóa học sinh viên có hai khóa ngoại được ánh xạ với bảng Sinh viên và Khóa học.

Về mặt logic, lược đồ là chính xác nhưng tôi đã mắc lỗi trong Cơ sở dữ liệu, vì mỗi bảng nên có một khóa chính.

Định nghĩa sql của tôi cho khóa học sinh viên là:

CREATE TABLE [dbo].[Student-Course] (
    [StudentID]  VARCHAR (12) NOT NULL,
    [CourseCode] VARCHAR (10) NOT NULL,
    CONSTRAINT [FK_Student-Course_ToCourse] FOREIGN KEY ([Course_Code]) REFERENCES [dbo].[Course] ([Code]) ON DELETE CASCADE,
    CONSTRAINT [FK_Student-Course_ToStudent] FOREIGN KEY ([Student_ID]) REFERENCES [dbo].[Student] ([Id]) ON DELETE CASCADE
);

Tôi đã tạo cặp khóa ngoại là khóa chính của bảng này và cập nhật thành:

CREATE TABLE [dbo].[Student-Course] (
    [StudentID]  VARCHAR (12) NOT NULL,
    [CourseCode] VARCHAR (10) NOT NULL,
    CONSTRAINT [PK_Student-Course] PRIMARY KEY CLUSTERED ([Student_ID] ASC, [Course_Code] ASC),
    CONSTRAINT [FK_Student-Course_ToCourse] FOREIGN KEY ([Course_Code]) REFERENCES [dbo].[Course] ([Code]) ON DELETE CASCADE,
    CONSTRAINT [FK_Student-Course_ToStudent] FOREIGN KEY ([Student_ID]) REFERENCES [dbo].[Student] ([Id]) ON DELETE CASCADE
);

Hy vọng nó sẽ giải quyết vấn đề cho một số kẻ.


Câu hỏi này đã có quá nhiều câu trả lời. Hơn nữa, hầu hết mỗi câu trả lời đều nói "thêm khóa chính" và người ta thực hiện nó trong bối cảnh nhiều-nhiều.
Gert Arnold

Bạn đúng, nhưng một số người thêm id khóa chính bổ sung trong bảng thứ ba, đây không phải là một cách tiếp cận tốt.
Summar Raja

Như câu trả lời khác cũng nói.
Gert Arnold
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.