1

私はEFとCode Firstのアプローチを試しています

次のようなアカウントモデルがあります

public class Account
{
   public virtual int AccountID {get; set;}
   public virtual string AccountName {get; set;}
   public virtual Account ParentAccount {get; set;}
   public virtual Contact AccountOwner {get; set}
}

Contact クラスは単純なクラスです

public class Contact
{
   public virtual int ContactID {get; set;}
   public virtual string ContactName {get; set;}
}

アカウント クラスに ID を追加する方法がわかりません。

コンテキストを正しく設定したとします。そのためには Account クラスにどのような変更が必要ですか。

  1. アカウントを別のアカウントの親として追加できます

  2. 特定のアカウントの ParentAccount にアクセスできます

  3. 特定のアカウントの AccountOwner にアクセスできます

私はこれが初めてです。どんな助けでもいただければ幸いです

4

3 に答える 3

1

これが私がこれを解決する方法です。

クラスに外部キー プロパティを追加します。と について話しParentAccountIdていAccountOwnerIdます。操作を簡単にするために、子アカウントのコレクションを Account に追加し、所有アカウントのコレクションを Contact に追加しました。「通常の」プロパティを仮想にする必要はないことに注意してください。ナビゲーション プロパティのみを仮想化する必要があります。

public class Account
{
    public int AccountID {get; set;}
    public string AccountName {get; set;}
    public int? ParentAccountId { get; set; }
    public int? AccountOwnerId { get; set; }

    public virtual Account ParentAccount { get; set; }
    public virtual ICollection<Account> ChildAccounts { get; set; }

    public virtual Contact AccountOwner { get; set; }

    public Account()
    {
        ChildAccounts = new List<Account>();
    }
}

public class Contact
{
    public int ContactID { get; set; }
    public string ContactName { get; set; }

    public virtual ICollection<Account> OwnedAccounts { get; set; }

    public Contact()
    {
        OwnedAccounts = new List<Account>();
    }
}

次に、Account クラスのマッピングを作成して、リレーションシップのセットアップ方法を EF に説明します。

public class AccountMapping : EntityTypeConfiguration<Account>
{
    public AccountMapping()
    {
        HasOptional(x => x.ParentAccount).WithMany(x => x.ChildAccounts).HasForeignKey(x => x.ParentAccountId);
        HasOptional(x => x.AccountOwner).WithMany(x => x.OwnedAccounts).HasForeignKey(x => x.AccountOwnerId);
    }
}

最後に、マッピングを DbContext クラスに追加します。

public MyContext : DbContext
{
    public DbSet<Account> Accounts { get; set; }
    public DbSet<Contact> Contacts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new AccountMapping());
    }
}

AccountOwner と ParentAccount はオプションであると想定していることに注意してください。必要な場合は、外部プロパティのタイプを からint?int変更HasOptionalし、マッピングの を に変更しHasRequiredます。

于 2013-01-06T10:22:13.017 に答える
0

これは、Fluent API を使用せずに行うことができます。つまり、デフォルトの規則は EF によって維持されます。マッピングが単純であるためです。

アカウント (1) : 連絡先 (m) の関係があります。

以下のモデルで試してみてください

public class Account
{
   public int Id {get; set;}
   public string AccountName {get; set;}
      
   public virtual ICollection<Contact> AccountOwners { get; set; }
}


public class Contact
{
   public int Id {get; set;}
   public string ContactName {get; set;}

   public virtual Account ParentAccount {get; set;}
}

次に、データベース テーブルが以下のように作成されます。

Accounts Table

Id            int             NotNull
AccountName   nvarchar(100)   AllowNull

   
Contacts Table

Id            int             NotNull
ContactName   nvarchar(100)   AllowNull
Account_Id    int             NotNull

高度なマッピングを行う必要がある場合は、Fluent API を学習する必要があります。

于 2013-01-06T09:10:29.223 に答える
0
public class Account
{
   [Key]
   public virtual int AccountID {get; set;}
   public virtual string AccountName {get; set;}
   public virtual Account ParentAccount {get; set;}
   public virtual Contact AccountOwner {get; set}
   public virtual IEnummerable<Account> ChiledAccount {get; set}
}

public class Contact
{
   [Key]
   public virtual int ContactID {get; set;}
   public virtual string ContactName {get; set;}
}
于 2013-01-06T08:39:51.217 に答える