2012-03-29 12 views
1

3つのペイロード列を持つ結合テーブル(TableAB)で結合された2つのテーブル(テーブルA、テーブルB)があります。ペイロードでは、Id、TableAId、およびTableBId以外の列を意味します。M:Mマッピング - EF 4.3 CodeFirst(既存のデータベース)

すべてのテーブルに正常に挿入できますが、Insertのペイロードカラムの1つにデータを挿入する必要があります。私はEF 4.3、Fluent APIを使用しています。誰も助けることができますか?前もって感謝します。

public class Organisation : EntityBase<int>, IAggregateRoot 
     { 
    public string Name { get; set; } 
    public string Url { get; set; } 
    public int CountryId { get; set; } 
    public int? OwnershipTypeId { get; set; } 
    public int OrganisationStatusId { get; set; } 

    public virtual ICollection<Feature> Features { get; set; } 
    public virtual ICollection<OrganisationType> OrganisationTypes { get; set; } 
    public virtual ICollection<PricePlan> PricePlans { get; set; } 
    public virtual ICollection<User> Users { get; set; } 

}

public class User: EntityBase<Guid>, IAggregateRoot 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string JobTitle { get; set; } 
    public int? PhoneCallingCodeId  { get; set; } 
    public int? PhoneAreaCode{ get; set; } 
    public string PhoneLocal { get; set; } 
    public int? MobileCallingCodeId { get; set; } 
    public int? MobileAreaCode { get; set; } 
    public string MobileLocal { get; set; }  

    public virtual ICollection<Organisation.Organisation> Organisations { get; set; } 

} 

    public class OrganisationUser : EntityBase<int>, IAggregateRoot 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime? EndDate { get; set; } 
    public int OrganisationRoleId {get; set;}//Foreign Key - have tried leaving it out, tried it as public virtual Organisation Organisation {get;set; 
    public bool IsApproved { get; set; } 
} 

    public class SDContext : DbContext 
{  

    public ObjectContext Core 
    { 
     get 
     { 
      return (this as IObjectContextAdapter).ObjectContext; 
     } 
    } 
    public IDbSet<User> User { get; set; } 

    public IDbSet<Organisation> Organisation { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     modelBuilder.Entity<Organisation>().HasMany(u => u.Users).WithMany(o => o.Organisations).Map(m => 
     { 
      m.MapLeftKey("OrganisationId"); 
      m.MapRightKey("UserId"); 
      m.ToTable("OrganisationUser"); 
     }); 

//私は、具体的流暢で外部キーを定義しようとしているが、私は本当に私がアクセスしたら、ペイロードプロパティを追加し、それらを編集することができます方法を理解する必要があります。

+1

は、あなたが持っているクラスを示してもらえ(特にでそれらのナビゲーションプロパティ)とFluentマッピング? – Slauma

+0

こんにちは、それは本当に重要ですか? IDのすべてが正しく挿入されるので、テーブルがPOCOで正しくマップされていることがわかります。私は単にペイロード列にアクセスする方法を知らない。私はOrganizationを持っていると言いましょう、私はUser、billing Plansなどを追加していますので、組織にコレクションを追加するためにforeachループでorganisation.Add(エンティティ)を使用して、関連するエンティティを取得します。ペイロード用の結合テーブルにアクセスするにはどうすればいいですか?私は結合用のPOCOクラスを作成しました。 – user1182263

+0

はい、あなたの質問のまわりの長い沈黙が証明されるので、問題ありません。あなたは必要な詳細を提供していないので、今までは答えがありません。最後のステートメントは重要です。結合テーブル用のエンティティがあり、ペイロードカラムを持つでしょうか?問題はどこにありますか?読み込んで変更して保存してください...質問を編集して(質問の下にある "編集"リンク)、もっと情報を追加することができます。 – Slauma

答えて

2

あなたのマッピングは、あなたの目的に合っていません。あなたはOrganisationUserの間の中間エンティティとしてOrganisationUserを扱いたい場合は、直接ではなくOrganisationUserの間、OrganisationOrganisationUser間とUserOrganisationUser間の関係を作成する必要があります。

独自のスカラープロパティを含む中間エンティティのため、多対多マッピングを作成できません。 EFは "ペイロード"との多対多の関係をサポートしていません。あなたは以下のことにより、多対多マッピングを交換する必要があります流暢APIで

public class Organisation : EntityBase<int>, IAggregateRoot 
{ 
    // ... 
    // this replaces the Users collection 
    public virtual ICollection<OrganisationUser> OrganisationUsers { get; set; } 
} 

public class User : EntityBase<Guid>, IAggregateRoot 
{ 
    // ... 
    // this replaces the Organisations collection 
    public virtual ICollection<OrganisationUser> OrganisationUsers { get; set; } 
} 

public class OrganisationUser : EntityBase<int>, IAggregateRoot 
{ 
    public int OrganisationId { get; set; } 
    public Organisation Organisation { get; set; } 

    public Guid UserId { get; set; } 
    public User User { get; set; } 

    // ... "payload" properties ... 
} 

::次の2つの1対多の関係を必要とする

modelBuilder.Entity<Organisation>() 
    .HasMany(o => o.OrganisationUsers) 
    .WithRequired(ou => ou.Organisation) 
    .HasForeignKey(ou => ou.OrganisationId); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.OrganisationUsers) 
    .WithRequired(ou => ou.User) 
    .HasForeignKey(ou => ou.UserId); 

あなたDbContextも別のセットを含むことが派生OrganisationUserエンティティのために:

public IDbSet<OrganisationUser> OrganisationUsers { get; set; } 

それはあなたが中間テーブルに何かを書くどのように今は明らかです:

var newOrganisationUser = new OrganisastionUser 
{ 
    OrganisationId = 5, 
    UserId = 8, 
    SomePayLoadProperty = someValue, 
    // ... 
}; 

context.OrganisastionUsers.Add(newOrganisastionUser); 
context.SaveChanges(); 

あなたはOrganisationIdUserIdの各ペアが唯一のリンクテーブルに一度に存在できることを確認するには、これら二つの列の複合主キーは、データベースの代わりで一意性を保証するために作成する方が良いだろう別のIdを使用してください。流暢APIでは、次のようになります。このようなモデルの種類とどのようにそれで動作するようにおよそ

modelBuilder.Entity<OrganisationUser>() 
    .HasKey(ou => new { ou.OrganisationId, ou.UserId }); 

詳細はこちら:

Create code first, many to many, with additional fields in association table

+0

工場に感謝します!私は今日それを今日試してみるでしょう。これまで読んだことがありましたが、今のところEFではこれがサポートされていないことに驚いています。助けてくれてありがとう。 – user1182263

+0

こんにちは、これは働いた。私はまだ問題がありましたが、EntityBaseを使用していたので、私のID仕様の列にIDを提供しようとしていたからです。本当に助けに感謝します。ありがとう。 – user1182263

+0

このケースの私の状況を調整すると、エラーが発生します。SqlException:外部キー 'FK_dbo.OrganisationUser_dbo.Organisation_OrganisationId'は、参照されたテーブル 'dbo.Organisation'の無効な列 'OrganisationId'を参照しています。制約を作成できませんでした。どうして? –

関連する問題