You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server或Entity Framework中创建非主键关联的一对多关系

SQL 实现方案

你需要的是**B为「一」端、A为「多」端**的一对多关系:1条B记录对应多条A记录,关联依据为B.ANameID = A.AName。
SQL中外键约束仅要求被引用的列具备唯一约束,无需是主键,你的B表ANameID已经设置了UNIQUE约束,直接在A表创建外键即可:

ALTER TABLE [A]
ADD CONSTRAINT FK_A_B_AName_Relation
FOREIGN KEY ([AName]) REFERENCES [B]([ANameID]);

如果不需要物理外键约束,也可以直接写关联查询实现逻辑关联:

-- 关联查询示例
SELECT A.*, B.* 
FROM A
INNER JOIN B ON A.AName = B.ANameID;

Entity Framework 实现方案

Code First 配置

先定义实体类:

public class A
{
    public long ID { get; set; }
    public Guid AName { get; set; }
    // 导航属性:单条A记录对应1条B记录
    public B B { get; set; }
}

public class B
{
    public long ID { get; set; }
    public Guid ANameID { get; set; }
    // 导航属性:单条B记录对应多条A记录
    public ICollection<A> AItems { get; set; } = new List<A>();
}

在DbContext的OnModelCreating方法中显式配置非主键关联:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置B表ANameID的唯一约束
    modelBuilder.Entity<B>()
        .HasIndex(b => b.ANameID)
        .IsUnique();

    // 配置一对多关系
    modelBuilder.Entity<A>()
        .HasOne(a => a.B)
        .WithMany(b => b.AItems)
        .HasForeignKey(a => a.AName) // A表的外键列
        .HasPrincipalKey(b => b.ANameID); // B表的关联列(非主键)
}

Database First 配置

如果是先建表再生成EF模型,直接在EDMX设计器中手动创建A、B两表的关联:设置B为主体端、多重性为1,A为依赖端、多重性为*,映射外键关系为A.AName对应B.ANameID即可。

内容的提问来源于stack exchange,提问作者JNickVA1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:54:08