Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 代码第一实体框架6:1到1,使用复合键_Entity Framework_Ef Code First_Entity Framework 6_Ef Fluent Api - Fatal编程技术网

Entity framework 代码第一实体框架6:1到1,使用复合键

Entity framework 代码第一实体框架6:1到1,使用复合键,entity-framework,ef-code-first,entity-framework-6,ef-fluent-api,Entity Framework,Ef Code First,Entity Framework 6,Ef Fluent Api,我继承了一个遗留的SQL数据库,我正试图首先将其反向工程为代码。由于旧版软件在当前配置上运行,因此无法更改架构。让我感到奇怪的是,开发人员将子表配置为具有由ChildId+ParentId组成的复合主键,而不仅仅是ParentId 以下是我所拥有的: public class Parent { public decimal PkParentId { get; set; } public string ParentName { get; set; } ... pu

我继承了一个遗留的SQL数据库,我正试图首先将其反向工程为代码。由于旧版软件在当前配置上运行,因此无法更改架构。让我感到奇怪的是,开发人员将子表配置为具有由ChildId+ParentId组成的复合主键,而不仅仅是ParentId

以下是我所拥有的:

public class Parent
{

    public decimal PkParentId { get; set; }
    public string ParentName { get; set; }
    ...
    public Child Child { get; set; }
}


public class Child
{

    public decimal PkChildId { get; set; }
    public decimal PkParentId { get; set; }
    public string ChildName { get; set; }
    ...
    public Parent Parent { get; set; }
}
这是我的映射。当我对其进行反向工程时,EF希望在父级中创建一个1对多的子级集合,但我确实希望1对0或1(单个子级可能存在,也可能不存在,但父级必须存在)

这将导致以下错误:在SET子句中多次指定列名“PkParentId”。在同一SET子句中,不能为列分配多个值。修改SET子句以确保列只更新一次。如果SET子句更新视图的列,则列名“PkParentId”可能会在视图定义中出现两次

如果检查生成的SQL,它会尝试使用子insert插入PkParentId两次,一次作为第一个参数,一次作为最后一个参数。这就像EF没有将PkParentId作为父nav属性的外键一样,所以我尝试将其添加到子配置中:

HasRequired(x => x.Parent).WithOptional(y => y.Child).Map(z => z.MapKey("PkParentId"));

这会产生同样的错误。奇怪的是,我找不到允许我使用“HasForeignKey”的可选关系,除非WithMany()强制我返回1:M。EF中的一对一始终包含一个主键,该主键也是外键。子对象的主键复制其父对象的值,并通过FK约束引用这些值

但是孩子的主键与父母的主键非常匹配!但事实并非如此

但这只有你知道。EF不必知道
Child
有一个复合键。只需将
PkChildId
标记为computed即可:

public ChildConfiguration()
{
    // Pk is composite on child
    HasKey(e => e.PkParentId);
    Property(p => p.PkChildId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
}

现在EF只能通过
PkParentId
识别
Parent
s和
Child
ren,当插入
Child
时,它只能从数据库中读取
PkChildId
,但不能将其用作实体键。

谢谢,效果很好。无法告诉你之前我试过多少次排列。
HasRequired(x => x.Parent).WithOptional(y => y.Child).Map(z => z.MapKey("PkParentId"));
public ChildConfiguration()
{
    // Pk is composite on child
    HasKey(e => e.PkParentId);
    Property(p => p.PkChildId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
}