【问题标题】:Entity Framework - Foreign keys and Navigation Properties实体框架 - 外键和导航属性
【发布时间】:2021-02-14 15:57:36
【问题描述】:

我需要您的帮助来理解表之间的关系。我很难理解使用带有外键属性的导航属性来定义关系的用法/需求。 鉴于以下 2 个类,

public class Person
{
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [Required]
        public string Name{ get; set; }
}

public class Package
{
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [Required]
        public Guid AccountId { get; set; }
        public virtual Person Account { get; set; }

        public Guid ShipperId { get; set; }
        public virtual Client Shipper { get; set; }

        [Required]
        public Guid ReceiverId { get; set; }
        public virtual Client Receiver { get; set; }

}

如果我尝试更新数据库,则会收到错误消息

在表 'Packages' 上引入 FOREIGN KEY 约束 'FK_' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

另一方面,如果我删除属性public Guid ....Id { get; set; },则使用外键创建数据库,但[Required] 注释无效。

包含Guid 属性和不包含有什么区别?

【问题讨论】:

  • 您是否尝试将[ForeignKey("AccountId")] 放在Account 属性上?这里是the tutorial
  • 另外,你能分享一下你的 Fluent Api 配置吗?
  • 有两个Id 属性。你删除了哪一个?我猜它是Person 中的那个。请阅读(外键)relationshipsowned types 的区别。
  • 完成此操作后,请注意关于 SQL Server 对外键的限制有很多问题。

标签: c# .net-core entity-framework-core foreign-keys


【解决方案1】:

尝试使用这些类:


 public class Person
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [Required]
        public string Name{ get; set; }

        [InverseProperty(nameof(Package.Account))]
        public virtual ICollection<Package> Packages { get; set; }

    }

    public class Package
    {
        
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [Required]
        public Guid AccountId { get; set; }
       
        [ForeignKey(nameof(AccountId))]
        [InverseProperty("Packages")]
        public virtual Person Account { get; set; }
    }

并在 dbcontext 中使用此代码:

modelBuilder.Entity<Package>(entity =>
{
    entity.HasOne(d => d.Person)
    .WithMany(p => p.Packages)
    .HasForeignKey(d => d.AccountId)
    .OnDelete(DeleteBehavior.ClientSetNull);

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多