Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6可选1:1包括不工作_C#_Entity Framework_Linq_Eager Loading - Fatal编程技术网

C# EF6可选1:1包括不工作

C# EF6可选1:1包括不工作,c#,entity-framework,linq,eager-loading,C#,Entity Framework,Linq,Eager Loading,正在尝试设置基本EF6可选1:1。非常令人沮丧。我读了很多,也丢了很多帖子 我有两个实体,客人和座位,每一个都可以独立存在,一个座位不需要客人,一个客人不需要座位 嘉宾模式: public int ID { get; set; } public int? SeatID { get; set; } [Required] public string FirstName { get; set; } //Link to

正在尝试设置基本EF6可选1:1。非常令人沮丧。我读了很多,也丢了很多帖子

我有两个实体,客人和座位,每一个都可以独立存在,一个座位不需要客人,一个客人不需要座位

嘉宾模式:

        public int ID { get; set; }

        public int? SeatID { get; set; }

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

        //Link to Seat
        public Seat Seat { get; set; }
座椅型号:

        public int ID { get; set; }

        public int? GuestID { get; set; }

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

        public bool Occupied { get { return (GuestID == null ? true : false); } }

        //Link to Guest
        public Guest Guest{ get; set; }
说到这一点,我遇到了很多问题。我必须将此添加到我的模型创建中,才能使关系正常工作:

       modelBuilder.Entity<Seat>()
            .HasOptional(g => g.Guest)
            .WithOptionalDependent(s => s.Seat);
在我看来,我使用

@Html.DisplayFor(modelItem => item.Guest.FirstName)
我想知道如何使include语句工作,最好不要延迟加载(如果必须的话,甚至使用)。另外,我不想有一张座位分配表,我考虑过沿着这条路走

我可以使用Viewmodel来实现这一点,但我不明白为什么1:1可选项没有加载相关数据

根据要求,这里是生成的模式…这里肯定发生了一些奇怪的事情。作为补充说明,我可以让它与viewmodel一起工作,但我不想


1-0..1关系配置与您想要的方式不同

  • 1-0..1 X和Y之间的关系意味着XId是X中的主键,也是Y中的主键,也是外键
  • 您所请求的是m=1和n=1的m-n关系,因此配置应该不同
  • 基于上述规则,您的代码应该如下

    客席

    public class Guest
    {
        public int ID { get; set; }
        [Required]
        public string FirstName { get; set; }
    
        public IList<Seat> Seats { get; set; }
    }
    
    public class Seat
    {
        public int ID { get; set; }
        [Required]
        public string SeatNumber{ get; set; }
    
        public IList<Guest> Guests { get; set; }
    }
    
    配置

    modelBuilder.Entity<GuestSeat>()
                .HasKey(gs => new {gs.GuestID,gs.SeatID})
                .ToTable("GuestSeats");
    modelBuilder.Entity<GuestSeat>()
                .HasRequired(g=>g.Guest)
                .WithMany(g=>g.Seats)
                .HasForeignKey(gs =>gs.GuestID)
                .DeleteOnCascade(false);
    modelBuilder.Entity<GuestSeat>()
                .HasRequired(s=>s.Seat)
                .WithMany(s=>s.Guests)
                .HasForeignKey(gs =>gs.SeatID)
                .DeleteOnCascade(false);
    
    modelBuilder.Entity()
    .HasKey(gs=>new{gs.GuestID,gs.SeatID})
    .ToTable(“旅客服务”);
    modelBuilder.Entity()
    .HasRequired(g=>g.Guest)
    .有许多(g=>g座位)
    .HasForeignKey(gs=>gs.GuestID)
    .DeleteOnCascade(假);
    modelBuilder.Entity()
    .HasRequired(s=>s.Seat)
    .有许多(s=>s.客人)
    .HasForeignKey(gs=>gs.SeatID)
    .DeleteOnCascade(假);
    
    此解决方案提供以下功能

  • 作为嘉宾,今天的活动我可以预订a座,明天的活动我可以预订B座
  • 座位A可由客人X占用,明天可由客人Y占用
  • 为确保座位在给定日期可由一个人占用,您可以在
    SeatID
    ReservedDate
    上创建一个唯一索引

  • 希望这将帮助您

    您必须构建如下所示的模型

    public class Guest
    {
            public int GuestId { get; set; }
    
            [Required]
            public string FirstName { get; set; }
    
            //Link to Seat
            public virtual Seat Seat { get; set; }
    }
    
    public class Seat
    {
            public int SeatId { get; set; }
    
            [Required]
            public string SeatNumber { get; set; }
    
            public bool Occupied { get { return (GuestID == null ? true : false); }}
    
            //Link to Guest
            public virtual Guest Guest{ get; set; }
    }
    
    Fluent API映射:

      modelBuilder.Entity<Seat>()
                .HasOptional(g => g.Guest)
                .WithOptionalDependent(s => s.Seat);
    

    你能展示不同的genretated表模式吗?把它添加到我的问题中,现在我知道它为什么不起作用了,但我更不清楚它是如何产生的。这两个答案都会起作用……但都不能完全完成我试图做的事情,也不能使include语句起作用。我将其标记为正确的,因为它更接近我用于解决方案的内容。两个答案都不能完全实现我想要做的事情。include语句仍然不适用于此解决方案。我使用Viewmodel来显示应该与include语句一起使用的相关信息。谢谢你们的建议,先生们,我能做些事情。两种解决方案都是正确的,各有各的特点。欢迎:)。希望你能给出自己的答案?
    public class Guest
    {
            public int GuestId { get; set; }
    
            [Required]
            public string FirstName { get; set; }
    
            //Link to Seat
            public virtual Seat Seat { get; set; }
    }
    
    public class Seat
    {
            public int SeatId { get; set; }
    
            [Required]
            public string SeatNumber { get; set; }
    
            public bool Occupied { get { return (GuestID == null ? true : false); }}
    
            //Link to Guest
            public virtual Guest Guest{ get; set; }
    }
    
      modelBuilder.Entity<Seat>()
                .HasOptional(g => g.Guest)
                .WithOptionalDependent(s => s.Seat);
    
    var seats = db.Seats.Include(s => s.Guest).ToList();