如何在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
相关产品推荐
相关产品推荐

