7

このトピックについてはいくつかの質問がありますが、私の質問は真の自己参照に非常に固有のものです. 他の質問の例はすべて循環参照であり、この場合は役に立ちません。

私がこのモデルを持っているとしましょう:

public class User
{
    [Key]
    public int Id { get; set; }

    ...

    public int CreatedByUserId { get; set; }
}

そしてこの地図:

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        this.HasRequired(a => a.CreatedByUser)
            .WithMany()
            .HasForeignKey(u => u.CreatedByUserId);
    }
}

移行によってこのコードを使用してデータベースが生成された後、SQL Management Studio で Id = 1、CreatedByUserId = 1 のユーザーを手動で追加できるため、このような自己参照が機能することがわかります。

ただし、EF を使用してユーザーを作成すると、「依存操作の有効な順序を判断できません」という問題が発生します。最初のエンティティに外部キーを持つ別の新しいエンティティを参照する新しいエンティティ (循環参照) に関する問題については、多くの質問があります。このような場合の解決策は、最初にエンティティの 1 つを保存するか、循環エンティティ外部キーに null 許容 ID を設定することです。最初は不可能であり、2番目はnull許容IDを持つことができないという外部制約であるため、どちらも実行できません。

したがって、エントリを手動で追加することでこれを達成する方法を見ると、EF5 の制限であると推測できます。回避策は何ですか?

4

2 に答える 2

1

の nullable バッカーとして機能する別のプロパティを追加することで、インターフェイスを満足させ、最初に保存してから setCreatedByUserIdメソッドを実行できます。

public class User : ICreatable 
{
    [Key]
    public int Id { get; set; }

    ...

    public int CreatedByUserId 
    { 
        get 
        {
            if (!_CreatedByUserId.HasValue)
                //throw new exception, something went wrong.

            return _CreatedByUserId;
        }       
        set 
        {
            _CreatedByUserId = value;
        }
    }

    int? _CreatedByUserId { get; set; }
}
于 2013-10-11T14:58:43.160 に答える