2017-05-03 16 views
1

注:この質問では、モデルを少し簡略化しました。Entity FrameworkはApplicationUser外部キーを生成しません

私はASP.NET Core MVCアプリケーション(Entity Framework Coreを使用)で作業しています。私は3つのモデルを持っています。私はApplicationUser(IdentityUserから拡張しています)を持っています。私はActivityモデルを持っていて、Activityへの外部キーとApplicationUserへの外部キーを持つSignUpモデルを持っています。少なくとも、それは考えです。つまり、Entity FrameworkはアクティビティFKをFKとして認識しますが、アプリケーションユーザは認識しません。これは、FK制約なしでデータベース内の別のintになります。

私はインターネットで見つけたことをたくさん試しましたが、うまく動作しません。これは私が現在、(明確にするために短縮)したものである:

活動:

public class Activity 
{ 
    public Activity() 
    { 
     SignUps = new HashSet<SignUp>(); 
    } 

    public int ActivityID { get; set; } 

    [Required] 
    [StringLength(50)] 
    [Display(Name = "Naam")] 
    public string Name { get; set; } 

    public virtual ICollection<SignUp> SignUps { get; set; } 
} 

ApplicationUser:

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 

     Activities = new HashSet<Activity>(); 
    } 

    [Required] 
    [Display(Name = "Voornaam")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "Achternaam")] 
    public string LastName { get; set; } 

    public virtual ICollection<Activity> Activities { get; set; } 
} 

新規アカウント:

public class SignUp 
{ 
    public int SignUpID { get; set; } 

    [Required] 
    public int ActivityID { get; set; } 

    [ForeignKey("ApplicationUser")] 
    public int ApplicationUserID { get; set; } 

    [Required] 
    public string Status { get; set; } 
} 

注:私が最初に持っていませんでした[ForeignKey]属性(アクティビティのような)ですが、それを動作させるためにそこにあります。

上記のとおり、SignUpのアクティビティFKは正常に動作しますが、Applicationuser FKはうまく動作しません。 Entity FrameworkはFK制約なしでデータベースにintを生成するだけで、CRUDページをスキャフォールするときにもFKとして認識されません。

私はASP.net MVCとEFにはかなり新しく、私は非常にシンプルなものを見落としていると感じています。 Facepalm moment incoming?

ありがとうございます!

答えて

2

Activityの関係は、そこにナビゲーションプロパティが含まれているために機能します。 ActivityICollection<SignUp>を有するので、EFは、SignUpActivityIDに結合して、そのコレクションを維持する。 ApplicationUserと同様のものはありません。 ApplicationUserIDというプロパティがあります。 EFは何もしません。なぜなら、それは考えていないからです。です。

だけでナビゲーションプロパティを追加して、あなたが良いでしょう:実際には、もう少しあなたのコードを見た後、私はあなただけで台無しにしているかもしれないと思う

[ForeignKey("ApplicationUser")] 
public int ApplicationUserID { get; set; } 
public ApplicationUser ApplicationUser { get; set; } 

はEDIT

ICollection<Activity>ApplicationUserです。 ApplicationUserActivityの間に直接の関係はありません。その関係は、SignUpによって行われます。これは、基本的にペイロード付きのM2Mです。その結果、あなたの代わりに、以下が必要です:

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 

     Activities = new HashSet<Activity>(); 
    } 

    [Required] 
    [Display(Name = "Voornaam")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "Achternaam")] 
    public string LastName { get; set; } 

    public virtual ICollection<SignUp> SignUps { get; set; } 
} 

その後、それはあなたのActivity関係は、現在とまったく同じように同じ機能するであろう。

+0

私はすでに期待していたフェイスパルムの瞬間です... SignUpの代わりに、おそらく数時間アシスタンスを見落としました。ああ、時には、あなたがそれをあまりにも長く見ていると、見逃してしまうことがあります。ありがとう!私はあなたの助けに感謝します :) – Landcross

関連する問題