我们在项目中使用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
的限制已经丢失。
在迁移脚本中手动添加此限制时,一切正常。还有其他解决方案吗?
答案 0 :(得分:1)
没有其他信息字符串会导致nvarchar。
所以你试图在char [10]和nvarchar [10]之间创建一个约束。
你必须使用史蒂夫所说的HasColumnType("char")
来强制你的PK类型。
NotUnicode可能不够,因为你会得到varchar(10)