0

質問し解決策も得ましたが、解決策はここで言及している新しい問題を引き起こします。ここでコードを変更し、 と の間に新しい 1 対 1 の関係を作成しAccountHolderますNominee

public partial class AccountHolder
{
    public int AccountHolderId { get; set; }

    public virtual List<Address> Address { get; set; }
    public virtual Nominee Nominee { get; set; }
}

public partial class Nominee
{
    public int NomineeId { get; set; }

    public virtual List<Address> Address { get; set; }
}

public partial class Address
{
    public int AddressId { get; set; }    

    public int AccountHolderId { get; set; }
    public AccountHolder AccountHolder { get; set; }

    public int NomineeId { get; set; }
    public Nominee Nominee { get; set; }
}

それらの関係は次のとおりです。

  1 to many between AccountHolder and Address
  1 to many between Nominee and Address
  1 to 1 between AccountHolder and Nominee

このための流暢な Api コードは次のとおりです。

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
                                            .WithRequired()
                                            .WillCascadeOnDelete(false);
        modelBuilder.Entity<Address>().HasRequired(p => p.AccountHolder)
                                      .WithMany(p => p.Address)
                                      .HasForeignKey(p => p.AccountHolderId)
                                      .WillCascadeOnDelete();
        modelBuilder.Entity<Address>().HasRequired(p => p.Nominee)
                                      .WithMany(p => p.Address)
                                      .HasForeignKey(p => p.NomineeId)
                                      .WillCascadeOnDelete();

まず、改善の余地がある場合は、私に提案してください。ここで私が直面している問題は、挿入するたびにAccountHolderの空のインスタンスを作成する必要がNomineeあり、挿入中に の空のインスタンスNomineeを作成する必要があることですAccountHolder。そして、私がこれをしないと、前の質問で述べたエラーが発生しました。この問題を解決する方法を教えてください。ソリューションにサンプルコードを追加してください。

データの挿入に使用しているコードは次のとおりです。

var accountHolder = new AccountHolder() { 
                      AccountHolderId = 901, 
                      Address = new List<Address>() 
                      { 
                        new Address() 
                        { 
                          HouseNumber = hnumber, 
                          Street = street, 
                          Nominee = new Nominee() //this is the issue
                        } 
                      }, 
                      Nominee = new Nominee() 
                      {  
                          Address = new List<Address>() 
                          {
                             new Address() 
                             { 
                               HouseNumber = n_hnumber, 
                               Street = n_street, 
                               AccountHolder = new AccountHolder() //this is the issue
                             } 
                          } 
                       } 
};

ありがとう!

4

2 に答える 2

0

やっと解決策がわかりましたが、もっと良い解決策があれば提案してください。私がしたことは、アドレステーブルにFKをオプションで作成することです(null許容):

クラスの変更:

public partial class Address
{
    public int AddressId { get; set; }    

    public int? AccountHolderId { get; set; }
    public AccountHolder AccountHolder { get; set; }

    public int? NomineeId { get; set; }
    public Nominee Nominee { get; set; }
}

流暢なAPIの変更:

modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
                                            .WithRequired()
                                            .WillCascadeOnDelete(false);
        modelBuilder.Entity<Address>().HasOptional(p => p.AccountHolder)
                                      .WithMany(p => p.Address)
                                      .HasForeignKey(p => p.AccountHolderId)
                                      .WillCascadeOnDelete();
        modelBuilder.Entity<Address>().HasOptional(p => p.Nominee)
                                      .WithMany(p => p.Address)
                                      .HasForeignKey(p => p.NomineeId)
                                      .WillCascadeOnDelete();
于 2013-03-03T16:21:05.847 に答える
-1

私があなたのニーズを理解している限り、以下が実行されます。

ノミニーとの 1 対 1 の関係では、ノミニーの PK も FK であるため、AccountHolderId の設定は少し難しいことに注意してください。

using System;
using System.Linq;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

namespace testEF {
    class Program {
        static void Main(string[] args) {
            using ( EFContext efc = new EFContext() ) {
                var AHAddress = new Address {
                    AddressId = 1,
                    HouseNumber = "150",
                    Street = "street",
                };
                var AHNominee = new Nominee {
                    NomineeId = 1,
                    Address = new List<Address>() { 
                        AHAddress
                    }};                
                var accountHolder = new AccountHolder() {
                    Address = new List<Address>() { 
                        AHAddress
                    },
                    Nominee = AHNominee
                };
                efc.Holders.Add(accountHolder);
                efc.SaveChanges();

                foreach (AccountHolder ah in efc.Holders) {
                    Console.WriteLine("{0} -> {1}", ah.AccountHolderId, ah.Nominee.NomineeId);
                }
            };
        }
    }

    public partial class AccountHolder {
        public int AccountHolderId { get; set; }

        public virtual List<Address> Address { get; set; }
        public virtual Nominee Nominee { get; set; }
    }

    public partial class Nominee {
        public int NomineeId { get; set; }

        public virtual List<Address> Address { get; set; }
    }

    public partial class Address {
        public int AddressId { get; set; }

        public String HouseNumber { get; set; }
        public String Street { get; set; }

        public int AccountHolderId { get; set; }
        public AccountHolder AccountHolder { get; set; }

        public int NomineeId { get; set; }
        public Nominee Nominee { get; set; }
    }


    public class EFContext : DbContext {
        public IDbSet<AccountHolder> Holders { get; set; }

        public EFContext()
            : base() {
            Database.SetInitializer<EFContext>(new DropCreateDatabaseAlways<EFContext>());
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
                                            .WithRequired()
                                            .WillCascadeOnDelete(false);
            modelBuilder.Entity<Address>().HasRequired(p => p.AccountHolder)
                                          .WithMany(p => p.Address)
                                          .HasForeignKey(p => p.AccountHolderId)
                                          .WillCascadeOnDelete();
            modelBuilder.Entity<Address>().HasRequired(p => p.Nominee)
                                          .WithMany(p => p.Address)
                                          .HasForeignKey(p => p.NomineeId)
                                          .WillCascadeOnDelete();
        }
    }    
}
于 2013-03-03T15:51:44.843 に答える