2015-05-04 59 views
0

我无法在两个表之间创建1到0..1的关系,其中主键是由两列组成的组合键。首先使用组合键和数据库的一对零关系或一个关系

这些表被导入到EF具有多对多的关系,改变到1周的结果在以下的误差的关系,1至0..1或1:

Multiplicity is not valid in Role Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *

主表:

CREATE TABLE [dbo].[MeasurementBlobs] (
    [MeasurementResultId] INT NOT NULL, 
    [ValueType]    SMALLINT NOT NULL, 
    [Id]     UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL, 
    [Value]     VARBINARY(MAX) FILESTREAM NOT NULL, 
    CONSTRAINT [PKMeasurementBlobs] PRIMARY KEY CLUSTERED ([MeasurementResultId], [ValueType]), 
    CONSTRAINT [FKMeasurementBlobsMeasurementResults] FOREIGN KEY ([MeasurementResultId]) REFERENCES [dbo].[MeasurementResults] ([Id]), 
    CONSTRAINT [UQMeasurementBlobsId] UNIQUE ([Id]) 
) 
GO 

外键表:

CREATE TABLE [dbo].[MeasurementBlobsMeasurementClusters] 
(
    [MeasurementResultId] INT NOT NULL, 
    [ValueType]    SMALLINT NOT NULL, 
    [MeasurementClusterId] INT NOT NULL, 
    CONSTRAINT [PKMeasurementBlobsMeasurementClusters] PRIMARY KEY CLUSTERED ([MeasurementResultId], [ValueType] ASC, [MeasurementClusterId] ASC), 
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementBlob] FOREIGN KEY ([MeasurementResultId], [ValueType]) REFERENCES [dbo].[MeasurementBlobs] ([MeasurementResultId], [ValueType]), 
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementCluster] FOREIGN KEY ([MeasurementClusterId]) REFERENCES [dbo].[MeasurementClusters] ([Id]) 
) 
GO 

使用每类型继承表的表是不是一种选择。

+0

模型首先假定您正在使用edmx生成数据库;考虑到你在这里有SQL并且已经声明这些表已经被导入到EF中,这看起来是Database First。另外,当你说“表格是以多对多关系导入的”时,你是什么意思?我没有看到第三张桌子在多对多方面是必要的? – Claies

+0

“将关系更改为1到0..1或1到1”您如何做到这一点?请显示映射。 –

+0

@Claies当然是你的权利,首先将标题改为数据库。那么,没有第三张表,它们是以这种方式导入的。 –

回答

1

您的数据库结构对于描述的关系多样性不正确。表MeasurementBlobsMeasurementClusters可能包含具有相同的多行(MeasurementResultId,ValueType),因此该关系的这一方必须具有类型*。在FK上放置一个唯一性约束,以允许该方具有多重性0..1

关系的另一方依赖于表MeasurementBlobs的PK,这当然在该表中是唯一的。虽然也许你可以模式那一边为“多”,你应该模型它为1。如果要将此边的多重性分配为0..1,则在其他表中必须使引用此表的外键可为空。

更新:更好的甚至比MeasurementBlobsMeasurementClusters设置一个单独的唯一性约束的FK将其PK取出MeasurementClusterId列,只留下FK的两列。如果FK的确必须在桌面上是独一无二的,那么它本身就是一个非常合适的PK。当然,在这种情况下,问题就出现了,为什么您需要为集群< - >测量blob关系建模一个单独的表格,而不是直接与FK关系建模。

+0

我已经尝试了外键上的唯一约束,这没有帮助。我也不能将外键设置为空,因为它同时是外键的主键。也许这是令EF令人困惑的真正问题。 –

+0

如果其他两列足以唯一标识一行,为什么表中的PK的一部分是“MeasurementClusterId”?或者,如果其他两个人不足以唯一标识一行,那么这相当于EF的投诉。 –

+0

您的EF对您的数据库将如何构建以模拟各种关系多重性有着特定的期望,显然它需要1:1和1:0..1的关系来检查实体的PK,而不仅仅是通过独特的FK。根据我之前的评论,我已经用另一个替代方案更新了我的答案。 –

0

问题是由外键表的主键造成的。

主键由三列组成,比外键需要的还多一列。以下是工作外键表定义:

CREATE TABLE [dbo].[MeasurementBlobsMeasurementClusters] 
(
    [MeasurementResultId] INT NOT NULL, 
    [ValueType]    SMALLINT NOT NULL, 
    [MeasurementClusterId] INT NOT NULL, 
    [IsFaultSource]   BIT NOT NULL, 
    CONSTRAINT [PKMeasurementBlobsMeasurementClusters] PRIMARY KEY CLUSTERED ([MeasurementResultId], [ValueType]), 
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementBlob] FOREIGN KEY ([MeasurementResultId], [ValueType]) REFERENCES [dbo].[MeasurementBlobs] ([MeasurementResultId], [ValueType]), 
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementCluster] FOREIGN KEY ([MeasurementClusterId]) REFERENCES [dbo].[MeasurementClusters] ([Id]) 
)