由于主键数据类型不同,不能使用EF创建1:1关系
本文关键字:EF 创建 关系 不能 数据类型 于主键 | 更新日期: 2023-09-27 17:50:58
我们在项目中使用EF,需要在数据库中的2个表(FundMaterList和FundMeta)之间创建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
的限制。
当在迁移脚本中手动添加此限制时,一切正常。还有其他可能的解决方案吗?
Steve是真的。
如果没有其他信息,String将导致nvarchar。
所以你试图在char[10]和nvarchar[10]之间创建约束。
你必须使用Steve所说的HasColumnType("char")
来强制PK的类型。
NotUnicode可能不够,因为您将获得varchar(10)