2

私はUser0または1を持っているかもしれないものを持っていますProfileProfileコードの観点からは、からアクセスできる方が便利なはずですUser(ユーザー情報にはプロファイルよりも頻繁にアクセスするため)が、これはEFコードファーストと競合します。

class User
{
    public int Id { get; set; }
    [ForeignKey("Id")]
    public virtual Profile Profile { get; set; }
}
class Profile
{
    public int Id { get; set; }
}

これをDbContextに入れると、テーブルが作成されます。これは、明らかな原則として、前に作成しUserなければ作成できないProfile=>badです。User最も簡単な(愚かなIの)解決策は明らかです:

class User
{
    public int Id { get; set; }
}
class Profile
{
    public int Id { get; set; }
    [ForeignKey("Id")]
    public virtual User User { get; set; }
}

これにより、データベースのより期待される動作が得られます。

しかし...私はこの解決策が最善のアプローチではないと感じています。たとえば、遅延読み込みを使用してすべてのプロファイルからすべてのユーザーにアクセスすることはできません。したがって、質問は「(DataAnnotationおよびFluentAPIを介して)1対0/1の関係を適切に設定する方法」です。言い換えれば、「「1User対0 Profile」の関係を適切に設定するにはどうすればよいですか?」

多分私はそれが完全に間違っていると思います...

4

2 に答える 2

2

編集:

ソリューションに削除時のカスケードを追加しました。

これを試して

public class User
{
    public int Id { get; set; }

    public int? UserProfileId { get; set; }
    public virtual UserProfile Profile { get; set; }
}

public class UserProfile
{
    public int Id { get; set; }

    public int UserId { get; set; }
    public virtual User User { get; set; }
}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasOptional(x => x.Profile).WithRequired(x => x.User).WillCascadeOnDelete(true);

        base.OnModelCreating(modelBuilder);
    }
于 2013-01-09T15:10:57.083 に答える
1

Draukaに感謝します。彼の提案は私を解決策に導きました:

class User
{
    public int Id { get; set; }
    [ForeignKey("Id")]
    public virtual Profile Profile { get; set; }
}
class Profile
{
    public int Id { get; set; }
    [Required, ForeignKey("Id")]
    public virtual User User { get; set; }
}

Requiredしたがって、他のエンティティがプリンシパルであるのに対し、エンティティが定義されているエンティティが依存していることをマークするトリックが実行されます。また、両方のテーブルに1つの列を保存します(外部キーIDの場合)。

残った問題は1つだけです。削除するときに、カスケードで確実Profileに削除されるようにする方法はUser

于 2013-01-09T15:47:12.900 に答える