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

使用EF Core框架创建SQLite数据库(一对多关联)

EF Core SQLite 一对多关联配置问题解决

我有以下两个模型,想要配置一对多关联:

AdminModel

public class AdminModel
{
    [Display(Name = "Hostname")]
    public EndpointAdminModel? Hostname { get; set; }

    [Display(Name = "Username")]
    public required string Username { get; set; }

    public Boolean Enabled { get; set; }

    [DataType(DataType.Date)]
    public DateTime? EnabledUntil { get; set; }
    
    [DataType(DataType.Date)]
    public DateTime? Created { get; set; }

    public string? CreatedBy { get; set; }

    [DataType(DataType.Date)]
    public DateTime? Modified { get; set; }

    public string? ModifiedBy { get; set; }
}

EndpointAdminModel

public class EndpointAdminModel
{
    [Key]
    [Display(Name = "Hostname")]
    public required string Hostname { get; set; }

    [Display(Name = "Administrator")]
    public ICollection<AdminModel>? Admin { get; set; }

    [Display(Name = "Enabled")]
    public Boolean Enabled { get; set; }

    [DataType(DataType.Date)]
    public DateTime? Created { get; set; }

    public string? CreatedBy { get; set; }

    [DataType(DataType.Date)]
    public DateTime? Modified { get; set; }

    public string? ModifiedBy { get; set; }
}

尝试用以下代码配置关联时:

modelBuilder.Entity<EndpointAdminModel>()
                .HasMany<AdminModel>(d => d.Admin)
                .WithOne(dm => dm.Hostname) 
                .HasForeignKey(d => new { d.Hostname, d.Username });

抛出异常:

System.InvalidOperationException类型的异常在Microsoft.EntityFrameworkCore.dll中发生但未在用户代码中处理:“无法将属性或导航属性'Hostname'添加到'AdminModel'类型,因为该类型已存在同名的属性或导航属性。”

改成.WithOne()后错误消失,但执行Database.EnsureCreated()时仍因模型问题失败。


解决方案

问题出在导航属性和外键字段命名冲突:AdminModel中的Hostname是指向EndpointAdminModel的导航属性,但配置里试图将Hostname同时作为外键字段使用,导致EF Core无法区分。

正确做法是:

  1. 给AdminModel添加独立的外键字段Hostname,同时将原导航属性重命名(比如改为Host),避免名称冲突:
public class AdminModel
{
    // 新增外键字段
    public required string Hostname { get; set; } 
    // 导航属性改名,避免和外键字段重名
    [Display(Name = "Host")]
    public EndpointAdminModel? Host { get; set; }

    // 其他原有属性不变
    [Display(Name = "Username")]
    public required string Username { get; set; }

    public Boolean Enabled { get; set; }

    [DataType(DataType.Date)]
    public DateTime? EnabledUntil { get; set; }
    
    [DataType(DataType.Date)]
    public DateTime? Created { get; set; }

    public string? CreatedBy { get; set; }

    [DataType(DataType.Date)]
    public DateTime? Modified { get; set; }

    public string? ModifiedBy { get; set; }
}
  1. 修改关联配置,明确关联导航属性和外键字段:
modelBuilder.Entity<EndpointAdminModel>()
    .HasMany(d => d.Admin)
    .WithOne(s => s.Host)
    .HasForeignKey(d => d.Hostname);

这样配置后,EF Core可以正确识别外键字段和导航属性,Database.EnsureCreated()也能正常执行,SQLite环境下完全适配1000条数据的存储需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:05:04