0

我在 Visual Studio 2012 的 Entity Framework 5 模型设计器中创建了以下模型:

在此处输入图像描述

然后我从模型生成数据库,这导致我的数据库中有以下表:

在此处输入图像描述

请帮助我理解为什么实体框架会为一对零或一关联生成一对多关系。


更新#1

此外,如果我将关联从 1:0..1 更改为 1:1,如下所示:

在此处输入图像描述

然后不仅数据库中仍然没有一对一的关系,而且现在一对多的关系被翻转了,这对我来说似乎更奇怪:

在此处输入图像描述


更新#2

回应神秘人的评论和回答,我期望在 SQL Server 中看到的结构,即有效的 1:0..1 关系如下:

在此处输入图像描述

此外,我可以使用以下 Code First 流畅映射完全按照预期工作:

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        ToTable("Users");

        HasKey(t => t.UserId);

        Property(t => t.UserId)
            .HasColumnName("UserId");

        Property(t => t.Name)
            .HasColumnName("Name")
            .IsRequired()
            .HasMaxLength(50);

        Property(t => t.EmailAddress)
            .HasColumnName("EmailAddress")
            .IsRequired()
            .HasMaxLength(254);

        Property(t => t.CreatedDateTime)
            .HasColumnName("CreatedDateTime");

        HasOptional(t => t.Subscription)
            .WithRequired(t => t.User);
    }
}

public class SubscriptionMap : EntityTypeConfiguration<Subscription>
{
    public SubscriptionMap()
    {
        ToTable("Subscriptions");

        HasKey(t => t.SubscriptionId);

        Property(t => t.SubscriptionId)
            .HasColumnName("SubscriptionId");

        Property(t => t.TypeValue)
            .HasColumnName("TypeValue");

        Property(t => t.CreatedDateTime)
            .HasColumnName("CreatedDateTime");

        Property(t => t.ExpiresDateTime)
            .HasColumnName("ExpiresDateTime");

        HasRequired(t => t.User)
            .WithOptional(t => t.Subscription);
    }
}

所以,我知道使用 Code First Entity Framework 可以实现这种行为。我的问题是为什么不能使用 Model First 方法来做到这一点。

这里发生了什么,为什么?

谢谢!

4

1 回答 1

2

SQL 无法定义真正的 1:1 或 1:0..1 数据模型,除非两个实体具有相同的主键。即便如此,你也不能有 1:1,因为你不能在单个语句中将记录插入多个表中,因此数据模型必须允许 1:0..1,因为存在中间状态一个记录将在没有另一个的情况下存在。

在 SQL 中做到这一点的唯一方法是完全按照 EF 在这里所做的事情,创建一个 1:*,然后施加约束以确保唯一性(例如唯一约束)。但是,EF 不支持约束(您必须手动创建它们),因此可能会插入多个记录并违反您的模型。

编辑:

既然您已经澄清您正在谈论 Model First,并且您正在寻找共享主键,那么这就是您必须做的事情。

右键单击关联,并在订阅和用户之间创建一个引用约束。这将导致 EF 生成您正在寻找的 1:0..1 关系。

于 2013-10-19T05:16:46.157 回答