1

StackOverflow のいくつかのスレッドを読みましたが、これを理解できませんでした。誰かがアドバイスをくれることを願っています。次のような POCO クラスがいくつかあります。

Person
{
  int PersonCode {get; set;}
  ...
  virtual List<PersonContact> {get; set;}
}

PersonContact
{
  int PersonPersonCode {get; set;}
  int ContactPersonCode {get; set;}
  int PersonContactTypeCode {get; set;}

  virtual PersonContactType {get; set;}
  virtual Person Person {get; set;}    // not sure I really need this one
  virtual Person Contact {get; set;}
}

各 Person レコードには、ゼロから多数の PersonContact レコードがあります。各 PersonContact レコードは、1 つの Person レコードを別の 1 つの Person レコードにリンクし、2 つの Person レコード間の関係のタイプを PersonContactTypeCode で示します。

Person レコードを関連する PersonContact レコードにナビゲートできるように、これをマップできる必要があります。このようなもの:

var john = new Person(...);
var david = new Person(...);
john.PersonContacts.Add(new PersonContact
  {
    Contact = david,
    PersonContactType = ... // manager
  });

その後

john.PersonContacts
  .Where(c => c.PersonContactType.PersonContactTypeCode == "manager")
  .FirstOrDefault();

戻るだろう

david

データ注釈と Fluent API の組み合わせを非常に多く試したので、どこから始めたか思い出せません。私はこの組み合わせで最高の運を持っているように見えました:

modelBuilder.Entity<Person>()
    .HasMany(entity => entity.PersonContacts)
        .WithRequired(person => person.Person)
        .HasForeignKey(xref => xref.PersonPersonCode)
        .WillCascadeOnDelete(false);

modelBuilder.Entity<Person>()
    .HasMany(entity => entity.PersonContacts)
        .WithRequired(xref => xref.Contact)
        .HasForeignKey(entity => entity.ContactPersonCode)
        .WillCascadeOnDelete(false);

しかし、複数の PersonContact を Person に追加しようとすると、次のエラーが発生します。

Multiplicity constraint violated. The role 'Person_PersonContacts_Source' of the
relationship '...Entities.Person_PersonContacts' has multiplicity
1 or 0..1.

どんな助けにも本当に感謝しています。私は今完全に困惑しています。ちなみに、私は必要に応じてこれらの POCO を変更することにオープンです。

4

3 に答える 3

1

これを試して:

public class Person
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int PersonId {get; set;}
   ...
   public virtual ICollection<PersonContact> PersonContacts {get; set;}
}


public class PersonContact
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public int ContactId {get; set;}

   [ForeignKey("Person"), DatabaseGenerated(DatabaseGeneratedOption.None)]
   public int PersonId {get; set;}       

   public virtual Person Person {get; set;}         
}

あなたが試みたように、私はProperty Mapping代わりに使用しました。Fluent Mappingご不明な点がございましたら、お知らせください。2 つのエンティティ間の関係に関しては、これが必要です。

于 2013-04-08T22:33:16.447 に答える
0

このようなものを使用して、同様の作業を行うことができました

私のドメインクラスで

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

    [Required]
    public virtual Person ContactPerson { get; set; }

    [Required]
    public virtual Person Person { get; set; }

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

}

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

    private readonly  List<PersonContact> _contacts = new  List<Contact>();

    public virtual  List<PersonContact> Contacts
    {
        get
        {
            return this._contacts;
        }
    }
}

私の文脈では

 public DbSet<Person> People { get; set; }
 public DbSet<PersonContact> Contacts { get; set; }

私は移行でこの変更を行い、生成されたテーブル作成コードを編集して、PersonContact テーブル内の person テーブルへの 2 つの外部キーに対して Cascade delete を false に設定する必要がありました。

PersonContact テーブルに追加の Person_Id1 列を取得します。Person_Id と同じデータが入力されているようです。これは、バインディングソースを作成するときに EF で必要になるようです。これがないとエラーが発生するためです。

明示的な外部キーを入れず、移行でそれらを作成させます。

于 2013-04-08T22:42:07.377 に答える