2013-03-03 148 views
0

我刚刚问了question并得到了解决方案,但解决方案创建了一个新问题,我在这里提到。在这里,我修改我的代码并在AccountHolderNominee之间创建新的1对1关系。通过代码优先发送1到多个关系

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 
          } 
          } 
         } 
}; 

谢谢!

+0

嘿,我想你的代码。并添加了一个新账户,只提供accountHolderId,它对我有用。顺便说一下,你的班级和关系是错误的,在句法上他们是正确的,虽然 – 2013-03-03 15:49:02

+0

当你为账户持有人插入地址时会出现问题,你能告诉我我的班级逻辑有什么问题吗? – gaurav 2013-03-03 15:54:03

+0

这是因为,您的地址表需要依赖两个FK,AddressId和NomineeId。地址表中的任何条目都将首先需要这两个条目。因此您必须在逻辑上输入代理人和地址两者 – 2013-03-03 15:57:08

回答

-1

据我了解您的需求,下面的运行。

请注意,设置AccountHolderId有点难,因为与被提名人一对一的关系,被提名人的PK也是FK。

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(); 
     } 
    }  
} 
0

好吧,最后我得到了解决方案,但如果有比我更好的解决方案,建议我。我所做的是建立在地址表可选(可为空)的FKS:

变化类:

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();