【问题标题】:Entity Framework Foreign Key as Primary Key Code First实体框架外键作为主键代码优先
【发布时间】:2026-02-19 09:35:02
【问题描述】:

我有两个代码优先模型,Foo 和 FooState,其中 Foo 有一个可选的 FooState。

public class Foo
{
    [Key]
    public int FooId { get; set; }

    public FooState FooState { get; set; }
}

public class FooState
{
    [Key]
    public int FooStateId { get; set; }

    [Required]
    public int State { get; set; }

    [Required]
    public Foo Foo { get; set; }
}

但是当我尝试像这样将外键添加到 FooState 时,这很好用

public class FooState
{
    [Key]
    public int FooStateId { get; set; }

    [Required]
    public int State { get; set; }

    [ForeignKey("Foo")]
    [Required]
    public int FooId
    public Foo Foo { get; set; }
}

这一切都失败了,因为 FooStateId 确实使用 FooId 作为它的主键。从数据库的角度来看,这是有道理的。

然而,我希望在保存 FooState 记录时不必填充 Foo 的实例,但仍保留所需的属性。

这将允许我在 dto 中发送 FooId 和状态,如果我想更改其状态,则不必从数据库中检索整个 Foo 对象。

我应该如何首先使用 EF 代码进行设置?

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    我想我会试一试,效果很好。

    public class FooState
    {
        [Required]
        [Key]
        [ForeignKey("Foo")]
        public int FooStateId { get; set; }
    
        [Required]
        public int State { get; set; }
    
        public Foo Foo { get; set; }
    }
    

    【讨论】:

    • 可以结合[Key,ForeignKey("Foo")]
    • 你能用流畅的 API 做同样的事情吗?