微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实体框架代码优先关系 - 如何定义两个对象之间的关系:两个实体之间的可选一对一

如何解决实体框架代码优先关系 - 如何定义两个对象之间的关系:两个实体之间的可选一对一

我有一个要求,我需要链接数据库中的 2 个实体(使用代码第一代),但我有点不确定如何定义外键/关系,以便我可以从另一个项目访问每个项目。

>

基本上,一个 Job 可以在没有任何票证的情况下存在。工单也可以在没有作业的情况下存在,但最终将为现有工单创建作业。

我使用的是实体框架 6

public class Job
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid JobId { get; set; }

    //Other Properties

    public virtual Ticket Ticket { get; set; }
}

public class Ticket
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid TicketId { get; set; }

    //Other Properties

    public virtual Job Job { get; set; }
}

然后,基本上我想要做的是选择一个带有工单的作业(如果有的话)和带有作业的工单(如果有的话)。

var tickets = context.Tickets
              .Include(ticket => ticket.Job);

var job = context.Jobs
              .Include(job => job.Ticket);

我是否在两个表上都放置了一个可为空的外键?

public class Job
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid JobId { get; set; }

    //Other Properties

    public Guid? TicketId { get; set; )

    [ForeignKey("TicketId")]
    public virtual Ticket Ticket { get; set; }
}

public class Ticket
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid TicketId { get; set; }

    //Other Properties

    public Guid? JobId { get; set; )

    [ForeignKey("JobId ")]    
    public virtual Job Job { get; set; }
}

...或者有没有更好的方法来做到这一点(最好使用数据注释)?

预先感谢您提供的任何指导。

编辑:以下内容似乎有效,但当然不能保证 TicketId 的 Job 和 JobId 的 TicketId 的唯一键: - 更正:这不适用于检索外键属性 - 见下文

public class Job
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid JobId { get; set; }

    //Other Properties

    [InverseProperty("Jobs")]
    public Guid? TicketId { get; set; )

    [ForeignKey("TicketId")]
    public virtual ICollection<Ticket> Tickets { get; set; }
}

public class Ticket
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid TicketId { get; set; }

    //Other Properties

    [InverseProperty("Tickets")]
    public Guid? JobId { get; set; )
  
    [ForeignKey("JobId ")]
    public virtual ICollection<Job> Jobs { get; set; }
}

编辑:请参阅 .NET Core 的 Serge 回答。我已经尝试了上述方法,但并没有检索每个实体的 Child 属性。 IE。检索作业时没有工单,检索工单时没有作业。

如果有人有任何想法,仍然会卡住!

解决方法

你必须修理你的桌子。如果您希望键自动递增,请将 Guid 更改为 int。还要注意 Nullable TicketId

public class Job
{
      [Key]
     public int Id { get; set; }
      public string Name { get; set; }
    
     public int? TicketId {get; set;}

    [ForeignKey(nameof(TicketId ))]
    [InverseProperty("Job")]
    public virtual Ticket Ticket { get; set; }
}

public class Ticket
{
      [Key]
     public int Id { get; set; }
      public string Name { get; set; }
    //Other Properties

 
    [InverseProperty("Ticket")]
    public virtual Job Job { get; set; }
}

使用此代码在 Vs 2019 和 MS SQL Server 中成功测试此模型

            var ticket = new Ticket { Name = "Ticket1" };
            _context.Tickets.Add(ticket);
            _context.SaveChanges();

            var job = new Job { Name = "Job1",TicketId=1};
            _context.Jobs.Add(job);
            _context.SaveChanges();

            var job2 = new Job { Name = "Job2" };
            _context.Jobs.Add(job2);
            _context.SaveChanges();

            var jobs = _context.Jobs.Include(i => i.Ticket).ToList();
            var tickets = _context.Tickets.Include(i => i.Job).ToList();
,
public class Job
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid JobId { get; set; }

    //Other Properties

    

    [ForeignKey("Ticket")]
    public int TicketId { get; set; }

    public virtual Ticket Ticket { get; set; }
    
    public virtual List<Job> Jobs { get; set; }

}

public class Ticket
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid TicketId { get; set; }

    //Other Properties

  

    [ForeignKey("Job")]   
    public int JobId { get; set; }


    public virtual Job Job { get; set; }
    
    public virtual List<Ticket> Tickets { get; set;}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。