由于主键数据类型不同,无法使用EF创建1:1关系

时间:2015-05-28 14:05:35

标签: c# entity-framework entity-framework-6

我们在项目中使用EF,需要在数据库中的2个表之间建立1:1关系( FundMaterList FundMeta )。

第一个( FundMasterList )是使用db first方法创建的,它有以下列作为主键:

[PerformanceID] [char](10) NOT NULL

和这个主要约束:

CONSTRAINT [PK_FundMasterList] PRIMARY KEY CLUSTERED 
([PerformanceID] ASC)
WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

第二个( FundMeta )是使用代码优先方法创建的,并具有以下声明:

public class FundMeta
{
    [Key]
    [StringLength(10)]
    [Column("PerformanceID")]
    public string InstId { get; set; }
    ...
}

以及以下映射

modelBuilder.Entity<FundMetadataEntity>()
                .Property(e => e.InstId)
                .IsFixedLength()
                .IsUnicode(false);

            modelBuilder.Entity<FundEntity>()
                .HasOptional(e => e.FundMeta)
                .WithRequired(e => e.Fund)
                .WillCascadeOnDelete();

FundMeta和Fund被宣布为虚拟。当我运行数据库更新时,我收到以下错误消息:

专栏&#39; dbo.FundMasterList.PerformanceID&#39;与引用列&#39; FundMetadats.PerformanceID&#39;不同的数据类型在外键&#39; FK_dbo.FundMetas_dbo.FundMasterList_PerformanceID&#39;。 无法创建约束。查看以前的错误。

当我删除创建关系时,工作正常并且表格中的列FundMeta具有与FundMasterList中相同的类型。创建关系似乎试图覆盖&#34;这个约束:

modelBuilder.Entity<FundMetadataEntity>()
                    .Property(e => e.InstId)
                    .IsFixedLength()
                    .IsUnicode(false);

修改

当我生成迁移脚本时,我注意到以下更改:

没有关系,它看起来不错:

AlterColumn("dbo.FundMeta", "PerformanceID",
 c => c.String(nullable: false, maxLength: 10, fixedLength: true, unicode: false));

添加关系后:

 DropPrimaryKey("dbo.FundMeta");
 AlterColumn("dbo.FundMeta", "PerformanceID", c => c.String(nullable: false, maxLength: 10));
 AddPrimaryKey("dbo.FundMeta", "PerformanceID");

这意味着fixedLength: true, unicode: false的限制已经丢失。

在迁移脚本中手动添加此限制时,一切正常。还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

史蒂夫是真的。

没有其他信息字符串会导致nvarchar。

所以你试图在char [10]和nvarchar [10]之间创建一个约束。

你必须使用史蒂夫所说的HasColumnType("char")来强制你的PK类型。

NotUnicode可能不够,因为你会得到varchar(10)