Asp.net mvc 如何在不同PK和FK的fluent api中配置一对零和一对一关系

Asp.net mvc 如何在不同PK和FK的fluent api中配置一对零和一对一关系,asp.net-mvc,database,entity-framework,asp.net-mvc-5,ef-fluent-api,Asp.net Mvc,Database,Entity Framework,Asp.net Mvc 5,Ef Fluent Api,我是一个初学者,从教程中学习流利的API。我阅读了一些已经给出的关于1-0,1-*的SO解决方案,但我无法正确理解它们。我只想使用fluent-API建立一对一和一对零的关系,前提是不遵循约定 房子和房间(可怕的例子) 要求: 1. One House can have zero room or ONE room MAX. 2. One Room must be inside a house. 3. If a room is deleted House SHOULD NOT Get Delete

我是一个初学者,从教程中学习流利的API。我阅读了一些已经给出的关于1-0,1-*的SO解决方案,但我无法正确理解它们。我只想使用fluent-API建立一对一和一对零的关系,前提是不遵循约定

房子和房间(可怕的例子)

要求:

1. One House can have zero room or ONE room MAX.
2. One Room must be inside a house.
3. If a room is deleted House SHOULD NOT Get Deleted
4. If a House is getting deleted and there is a room then
  User should first delete the room then only House should be allowed to be deleted.


public class House
{
    public int HouseId { get; set; }
    public string HouseName { get; set; }
    public virtual Room Room { get; set; }
}

public class Room
{
    public int RoomId { get; set; }
    public string RoomName { get; set; }
    public int HouseId { get; set; }
    public virtual House House { get; set; }
}
所以,房间不可能存在,但房子可以存在。此外,如果一所房子有房间,它只能有一间

         dBModelBuilder.Entity<House>()
            .HasOptional(f => f.Room)
            .WithRequired(s => s.House);
dBModelBuilder.Entity()
.has可选(f=>f.Room)
.需要(s=>s.House);
我看到了一些解决方案,但他们告诉我要将PK和FK设置为相同的。但是我不想那样做。是否有一种方法可以实现我想要的而不必将PK和FK设置为相同的。我不希望HouseID成为我房间类的主键。在我的案例中,委托人是房子,受抚养人是房间。我是否需要添加诸如
“可选依赖项”或“可选主体”之类的soemthing
。有人能给我指点路吗?我是初学者

另外,我是否需要从任何模型中删除导航属性?这是无关的吗

如何告诉EF使用房间类别的HouseId作为FK

在我的情况下,委托人是房子,受抚养人是房间

那么你就在正确的轨道上了

modelBuilder.Entity<House>()
    .HasOptional(f => f.Room)
    .WithRequired(s => s.House)
使用
Map
fluent API和
MapKey
指定FK列名:

modelBuilder.Entity<House>()
    .HasOptional(f => f.Room)
    .WithRequired(s => s.House)
    .Map(c => c.MapKey("HouseId"));
modelBuilder.Entity()
.has可选(f=>f.Room)
.需要(s=>s.House)
.Map(c=>c.MapKey(“HouseId”);

这将为您提供所需的数据库表设计(尽管除了手动编辑迁移外,没有办法将
HouseId
列限制为唯一)。

非常感谢您的回答,先生,您能告诉我一件事吗。如果我有两张一号房间和二号房间的桌子,它们都与一号房间有相似的关系,即一对一/零。那么我将如何使用基本EF方法处理它。你也能举个例子吗。由于这种担心,我只想有一个单独的FK,因为我的房子将有一对一/零和多个桌子,你能给我一个基本的例子,有相同的PK FK,但使用与房子相关的多个桌子吗?所以,假设我想有相同的FK和PK,那么在多个桌子的情况下,我将如何处理它。陛下,你理解我的怀疑吗?是的。但只要房子是本金就没有问题,因为唯一受影响的是家属的PK。在原始模型中,
RoomId
将不是标识,而是简单的
int
,并将标记为
Room
PK
,以及FK to
House
。如果您有
House
的其他一对一扩展,也会发生同样的情况。因此,要使用共享PK,只需删除
HouseId
并使用原始的fluent设置。如果您不受现有数据库的限制,我建议使用共享PK方法。顺便说一句,EF Core没有这样的限制,并且很好地支持这两种场景(尽管默认情况下仍然使用共享PK)。
modelBuilder.Entity<House>()
    .HasOptional(f => f.Room)
    .WithRequired(s => s.House)
    .Map(c => c.MapKey("HouseId"));