2012-04-30 8 views
1

私はASP.Net MVC3 EF4.1のプロジェクトと外部キーによるテーブル間の関係に取り組んでいます。私はデータベースの最初のアプローチを使用して、3つのテーブルを持っています:カレンダー、カレンダーのユーザーとユーザー。この関係は、カレンダーには多数のユーザーが存在し、ユーザーには多数のカレンダーを持たせることができます。Mvc3データベースの最初の関係

誰かがカレンダーを作成している場合、そのユーザーはカレンダーにアクセスするユーザー数を選択することになります。しかし今、私が混乱すると、コントローラのデータベースに変更を保存しようとしています。生成されたクラスには、何らかの形で外部キーを表す仮想ICollectionもあります。しかし、私はそれらをどう扱うべきかを理解できません。それでどうやって動くのだろう?仮想ICollectionsに変更を追加し、db.SaveChanges()を実行するだけで、それは自動的に機能するのでしょうか、それとも手動で処理すると思いますか?

手動で処理する必要がある場合は、ユーザーを追加し、カレンダーを追加してから、CalendarUsersテーブルにキーを追加してバインドしてください。 OnModelCreatingメソッドにコードを入力して関係を明確にしたコードの例をいくつか見てきましたが、まずDatabaseを使用するときにはそれだけが含まれています:throw new UnintentionalCodeFirstException();?あなたはおそらく私のためにそれを明確にすることができますように願っています。あなたは、ナビゲーションプロパティを更新することができますし、EFはあなたのための外部キーの世話をします

public partial class Calendar 
{ 
    public Calendar() 
    { 
     this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public int CalendarId { get; set; } 
    public string CalendarTitle { get; set; } 
    public string CalendarDescription { get; set; } 
    public long UserId { get; set; } 

    public virtual User User { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 

public partial class CalendarUser 
{ 
    public int CalendarUserId { get; set; } 
    public int CalendarId { get; set; } 
    public long UserId { get; set; } 
    public Nullable<bool> IsAdmin { get; set; } 

    public virtual Calendar Calendar { get; set; } 
    public virtual User User { get; set; } 
} 

public partial class User 
{ 
    public User() 
    { 
     this.Calendars = new HashSet<Calendar>(); 
     this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public long UserId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Calendar> Calendars { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 
+0

あなたが作成したクラスを表示することができますか? (すべての詳細ではなく、クラスとキーと外部キーのプロパティを参照するプロパティだけです)重要な質問は、 'CalendarUsers'のための別のクラスを持っている場合、またはそれが(多対多の)モデルにクラスを持たないテーブル。 – Slauma

+0

CalendarUsersは別のクラスです。多分それは良いアプローチではないでしょうか? – Janspeed

+0

'CalendarUser'クラスはOKです。' IsAdmin'フラグのために必要です。もっと紛らわしいのは、 'Calendar.User'と' User.Calendars'の間の追加の一対多の関係です。なぜあなたはこれを持っていますか?関係は多対多であり、モデル( 'Calendar.CalendarUsers'と' User.CalendarUsers')にもあります。しかし、この追加の一対多関係の目的は何ですか? – Slauma

答えて

0

CalendarUserの新しいインスタンスの外部キープロパティを設定することにより、CalendarUserを既存:

var newCalendarUser = new CalendarUser 
{ 
    CalendarId = calendarId, 
    UserId = userId, 
    IsAdmin = true // or false 
}; 
dbContext.CalendarUsers.Add(newCalendarUser); 
dbContext.SaveChanges(); 
+0

新しいCalendarUserを追加しようとすると、私はクラスに空のコンストラクタがないと言います。私はそのようなコンストラクタを追加することができましたが、私のモデルを更新するたびにコンストラクタをリメイクする必要がありました。それで私は何かを逃したと思っているのですか?また、それが本当にどういう意味なのか、私は疑問に思いますか?なぜなら、私はすべての関係を自分自身と、それに続くすべてのコーディングを追跡しなければならないだろうか?パブリック仮想ICollection の目的は何ですか?たくさんの質問をして申し訳ありません。私は本当に努力を感謝します。 – Janspeed

+0

は、私は次のエラーを取得:[MissingMethodException:このオブジェクトのために定義されていませんパラメータなしのコンストラクタを] System.RuntimeTypeHandle.CreateInstance(RuntimeTypeタイプ、ブールpublicOnly、ブールNOCHECK、ブール&canBeCached、RuntimeMethodHandleInternal&CTOR、ブール&bNeedSecurityCheck)+0 System.RuntimeType .CreateInstanceSlow(Boolean publicOnly、Boolean skipCheckThis、Boolean fillCache)+117 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly、Boolean skipVisibilityChecks、Boolean skipCheckThis、Boolean fillCache)+247 – Janspeed

+0

@Janspeed:なぜCalendarUserにパラメータを持たないコンストラクタがないのですか? ?上のコード例では、 'CalendarUser'はコンストラクタをまったく持っていません(つまり、デフォルトで**パラメータなしのコンストラクタを持っています)。または、別の部分またはこの* partial *クラスのパラメータを持つコンストラクタを持っていますか?もしそうであれば、C#でパラメータを持つコンストラクタを追加すると、デフォルトのパラメータのないコンストラクタが削除されるため、パラメータのないコンストラクタを手動で追加する必要があります(空のコンストラクタのみ)。 – Slauma

0

は、下のDBcontext Generatorで生成されたクラスを追加しました。同様の多対多の関係で更新を処理するサンプルコードについては、は、このチュートリアルの講師ページの編集セクションにコースの割り当ての追加を参照してください:あなたはちょうど間の新たな関係を作成することができます

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

非常に興味深いチュートリアルでしたが、サンプルをダウンロードし、OnModelCreatingメソッドを使用してリレーションをマップしています。このメソッドは、まずデータベースで作業することができるかどうかわからないので混乱させます。ここで私はいくつかの重要な知識が欠けているように感じます。たぶん私はデータベースを最初に捨て、最初にコードに移動しなければならないだろうが、私はそうしたくないだろうか? – Janspeed

関連する問題