0

Visual Studio 2012 の Entity Framework 5 モデル デザイナーで次のモデルを作成しました。

ここに画像の説明を入力

次に、モデルからデータベースを生成すると、データベースに次のテーブルが作成されました。

ここに画像の説明を入力

Entity Framework が 1 対 0 または 1 の関連付けに対して 1 対多の関係を生成する理由を理解してください。


更新 #1

さらに、関連付けを 1:0..1 から 1:1 に変更すると、次のようになります。

ここに画像の説明を入力

次に、データベースにまだ 1 対 1 の関係が存在しないだけでなく、1 対多の関係が逆転しているため、さらに奇妙に思えます。

ここに画像の説明を入力


アップデート #2

Mystere Man のコメントと回答に応えて、有効な 1:0..1 の関係である SQL Server で見られると予想される構造は次のとおりです。

ここに画像の説明を入力

さらに、次の Code First fluent マッピングを使用して、これを意図したとおりに機能させることができます。

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:* を作成してから、一意性を保証する制約 (Unique Constraint など) を課すことです。ただし、EF は制約をサポートしていないため (手動で作成する必要があります)、複数のレコードを挿入してモデルに違反する可能性があります。

編集:

Model First について話していること、および共有主キーを探していることを明確にしたので、次のことを行う必要があります。

アソシエーションを右クリックし、サブスクリプションとユーザーの間の参照制約を作成します。これにより、探している 1:0..1 の関係が EF によって生成されます。

于 2013-10-19T05:16:46.157 に答える