C# 实体框架中的两列外键
我有两个表:C# 实体框架中的两列外键,c#,sql,.net,entity-framework,visual-studio-2013,C#,Sql,.net,Entity Framework,Visual Studio 2013,我有两个表:operation和operation\u category\u element\u relation operation表有一个复合主键operation\u id:bigint和date\u数据:nvarchar(10)。operation\u category\u element\u relation也有这些列。基于这两列的表之间存在关系。添加ADO.NET实体数据模式后,我得到两个错误: 错误13101:引用约束的从属角色中所有属性的类型必须与主体角色中相应的属性类型相同。实
operation
和operation\u category\u element\u relation
operation
表有一个复合主键operation\u id:bigint
和date\u数据:nvarchar(10)
。operation\u category\u element\u relation
也有这些列。基于这两列的表之间存在关系。添加ADO.NET实体数据模式后,我得到两个错误:
错误13101:引用约束的从属角色中所有属性的类型必须与主体角色中相应的属性类型相同。实体“操作\类别\元素\关系”上的属性“操作\日期\数据”的类型与引用约束“FK\操作\类别\元素\关系\操作”中实体“操作”上的属性“操作\ id”的类型不匹配
及
错误13101:引用约束的从属角色中所有属性的类型必须与主体角色中相应的属性类型相同。实体“operation\u category\u element\u relation”上的属性“operation\u id”的类型与引用约束“FK\u operation\u category\u element\u relation\u operation”中实体“operation”上的属性“date\u data”的类型不匹配
你能解释一下问题是什么以及如何解决它吗
自动生成的edmx文件的内容为:
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
<!-- EF Runtime content -->
<edmx:Runtime>
<!-- SSDL content -->
<edmx:StorageModels>
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl" Namespace="TEMPDataModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005">
<EntityContainer Name="TEMPDataModelTargetContainer"></EntityContainer>
</Schema>
</edmx:StorageModels>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="TEMPDataModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" annotation:UseStrongSpatialTypes="false">
<EntityContainer Name="TEMPDataModelContainer" annotation:LazyLoadingEnabled="true"></EntityContainer>
</Schema>
</edmx:ConceptualModels>
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs" Space="C-S">
<Alias Key="Model" Value="TEMPDataModel" />
<Alias Key="Target" Value="TEMPDataModel.Store" />
<EntityContainerMapping CdmEntityContainer="TEMPDataModelContainer" StorageEntityContainer="TEMPDataModelTargetContainer"></EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
<Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
<Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
</DesignerInfoPropertySet>
</Connection>
<Options>
<DesignerInfoPropertySet>
<DesignerProperty Name="ValidateOnBuild" Value="true" />
<DesignerProperty Name="EnablePluralization" Value="true" />
<DesignerProperty Name="IncludeForeignKeysInModel" Value="true" />
<DesignerProperty Name="UseLegacyProvider" Value="false" />
<DesignerProperty Name="CodeGenerationStrategy" Value="None" />
</DesignerInfoPropertySet>
</Options>
<!-- Diagram content (shape and connector positions) -->
<Diagrams></Diagrams>
</Designer>
</edmx:Edmx>
看起来您已经设置了与翻转的列的关系。请注意,第一个错误表明
操作\u日期\u数据的类型与操作\u id
不匹配。它应该与相关对象中的非id数据相匹配。检查关联上的引用约束,确保列的顺序相同。在此处找到答案:
如果外键列的顺序与主表中键列的顺序不同,则复合外键会发生这种情况。可用于重新编程的示例表:
CREATE TABLE [dbo].[Table1] (
[Id] INT NOT NULL,
[IdString] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([IdString] ASC, [Id] ASC)
);
CREATE TABLE [dbo].[Table3]
(
[TableId] INT NOT NULL PRIMARY KEY,
[IdString] NVARCHAR (50) NULL,
[Id] INT NULL,
CONSTRAINT [FK_Table3_ToTable] FOREIGN KEY (IdString, Id) REFERENCES [Table1](IdString, Id),
)
UPD。在我的例子中,我还必须根据PK中字段的顺序更改字段的顺序
希望这有助于在操作(类别)元素(关系)
中
操作(id)和日期(data)的数据类型是什么
?它们必须是相同的。它们是相同的-我没有编写它,但它们与操作中对应的IG列相同我刚刚检查了SSMS中的关系,只是为了确保-列没有翻转。不,您需要在EDMX中检查它。问题是EDMX文件没有正确生成。我已经检查了我的一些其他数据库,以确保VS没有问题-一切都很好。对于带有操作和操作类别元素关系表的问题数据库,edmx文件内容有些奇怪。我已经编辑了我的问题,并将edmx文件的内容放在那里。要修复它,您需要修改edmx。您可以通过设计器单击关联并选择引用约束旁边的省略号按钮来完成此操作。或者,您可以直接编辑EDMX(在CSDL的关联节点中),如果您将来需要重新生成,则应保留该EDMX。谢谢,我也有相同的错误,但在我的案例中,我遇到了一个问题,即我使用的复合键使用了3列,但表中的主键仅指定了2列主键(很难解释,但显然EF不喜欢)谢谢!在我的情况下,我必须切换外键表中复合键的顺序,以将外键设置为我想要指出的2个复合键中的第一个键(因为我错过了它)必须匹配的是列的相对顺序而不是位置,而且表中列的顺序比外键中选择器的顺序更重要。例如,如果按照复合键的要求显式分配列顺序,则需要在两个主键中使用相同的列顺序nd依赖表。在两个表之间查找具有相同名称的无序列是有帮助的,但这可能会错过primary.Id应该与dependent.PrimaryId匹配的情况