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

本文关键字:EF 创建 关系 不能 数据类型 于主键 | 更新日期: 2023-09-27 17:50:58

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

第一个(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]

Second (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被声明为虚拟值。当我运行数据库更新时,我得到以下错误消息:

dbo.FundMasterList列"。PerformanceID'与引用列' fundmetadata '的数据类型不同。外键"FK_dbo.FundMetas_dbo.FundMasterList_PerformanceID"。不能产生约束。

当我删除创建关系时,一切都很好,表FundMeta中的列与FundMasterList中的列具有相同的类型。似乎创建关系试图"覆盖"这个约束:

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的限制。

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

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

Steve是真的。

如果没有其他信息,String将导致nvarchar。

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

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

NotUnicode可能不够,因为您将获得varchar(10)