EF6 可选 1:1 包括不工作
EF6 Optional 1:1 include not working
正在尝试设置基本的 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);
现在我的应用程序正在运行,但是当我尝试使用包含方法加载相关数据时,它只是空白,什么也没有。
var seats = db.Seats.Include(s => s.Guest);
return View(seats.ToList());
在我看来我使用
@Html.DisplayFor(modelItem => item.Guest.FirstName)
我想知道如何使 include 语句工作,最好不要延迟加载(如果必须的话,甚至可以)。另外,我不想有 SeatAssignment table,我考虑走这条路。
我可以为此使用 Viewmodel,但我不明白为什么 1:1 选项没有加载相关数据。
根据要求,这是生成的模式...这里肯定发生了一些奇怪的事情。作为旁注,我可以让它与视图模型一起工作,但我不想这样做。
1-0..1关系配置和你想要的不一样
- X和Y之间的1-0..1关系表示XId是X中的主键并且XId也是Y中的主键也是外键
- 你要求的是m-n关系,m=1,n=1,所以配置应该不一样。
根据上述规则,您的代码应如下
访客class
public class Guest
{
public int ID { get; set; }
[Required]
public string FirstName { get; set; }
public IList<Seat> Seats { get; set; }
}
座位class
public class Seat
{
public int ID { get; set; }
[Required]
public string SeatNumber{ get; set; }
public IList<Guest> Guests { get; set; }
}
加入table
public GuestSeat
{
public int GuestID{get;set;}
public int SeatID{get;set;}
public DateTime ReservedDate{get;set;}
// other fields goes here
}
配置
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);
此解决方案提供以下内容
- 作为嘉宾,今天的活动我可以预定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; }
}
流畅API映射:
modelBuilder.Entity<Seat>()
.HasOptional(g => g.Guest)
.WithOptionalDependent(s => s.Seat);
然后:
var seats = db.Seats.Include(s => s.Guest).ToList();
正在尝试设置基本的 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);
现在我的应用程序正在运行,但是当我尝试使用包含方法加载相关数据时,它只是空白,什么也没有。
var seats = db.Seats.Include(s => s.Guest);
return View(seats.ToList());
在我看来我使用
@Html.DisplayFor(modelItem => item.Guest.FirstName)
我想知道如何使 include 语句工作,最好不要延迟加载(如果必须的话,甚至可以)。另外,我不想有 SeatAssignment table,我考虑走这条路。
我可以为此使用 Viewmodel,但我不明白为什么 1:1 选项没有加载相关数据。
根据要求,这是生成的模式...这里肯定发生了一些奇怪的事情。作为旁注,我可以让它与视图模型一起工作,但我不想这样做。
1-0..1关系配置和你想要的不一样
- X和Y之间的1-0..1关系表示XId是X中的主键并且XId也是Y中的主键也是外键
- 你要求的是m-n关系,m=1,n=1,所以配置应该不一样。
根据上述规则,您的代码应如下
访客class
public class Guest
{
public int ID { get; set; }
[Required]
public string FirstName { get; set; }
public IList<Seat> Seats { get; set; }
}
座位class
public class Seat
{
public int ID { get; set; }
[Required]
public string SeatNumber{ get; set; }
public IList<Guest> Guests { get; set; }
}
加入table
public GuestSeat
{
public int GuestID{get;set;}
public int SeatID{get;set;}
public DateTime ReservedDate{get;set;}
// other fields goes here
}
配置
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);
此解决方案提供以下内容
- 作为嘉宾,今天的活动我可以预定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; }
}
流畅API映射:
modelBuilder.Entity<Seat>()
.HasOptional(g => g.Guest)
.WithOptionalDependent(s => s.Seat);
然后:
var seats = db.Seats.Include(s => s.Guest).ToList();