实体框架多对多

时间:2015-11-04 14:15:35

标签: c# entity-framework many-to-many

第一个模型

[Table("Blotter.DealingDesk")]
public partial class DealingDesk
{
    public DealingDesk()
    {
        DealingStatus = new HashSet<DealingStatus>();
    }

    public int DealingDeskId { get; set; }

    [Required]
    [StringLength(50)]
    public string Country { get; set; }

    [Required]
    [StringLength(50)]
    public string DealingDeskCode { get; set; }

    public virtual ICollection<DealingStatus> DealingStatus { get; set; }
}

第二种模式

[Table("Blotter.EmailAddress")]
public partial class EmailAddress
{
    public EmailAddress()
    {
        LUDealingDeskEmails = new HashSet<LUDealingDeskEmail>();
    }

    [Key]
    public int EmailId { get; set; }

    [Required]
    [StringLength(150)]
    public string Email { get; set; }



 public virtual ICollection<LUDealingDeskEmail> LUDealingDeskEmails { get; set; }
 }

第三模型(查找表为POCO)

[Table("Blotter.LUDealingDeskEmail")]
public partial class LUDealingDeskEmail
{
    public int LUDealingDeskEmailId { get; set; }

    public int FK_EmailId { get; set; }

    public int FK_DealingDeskId { get; set; }

    public virtual DealingDesk DealingDesk { get; set; }

    public virtual EmailAddress EmailAddress { get; set; }
}



public partial class MCUtilityContext : DbContext
{
    public MCUtilityContext()
        : base("name=MCUtilityContext")
    { 
        Database.SetInitializer<CapstoneInterfaceContext>(null);

        Configuration.ProxyCreationEnabled = true;
        Configuration.LazyLoadingEnabled = true;
    }

    public virtual DbSet<DealingDesk> DealingDesks { get; set; }

    public virtual DbSet<DealingStatus> DealingStatus { get; set; }

    public virtual DbSet<EmailAddress> EmailAddresses { get; set; }

    public virtual DbSet<LUDealingDeskEmail> LUDealingDeskEmails { get; set; }

    public virtual DbSet<ApplicationError> ApplicationErrors { get; set; }

    public virtual DbSet<Connection> Connections { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DealingDesk>()
            .HasKey(k => k.DealingDeskId);

        modelBuilder.Entity<DealingStatus>()
            .HasKey(k => k.DealingStatusId)
            .HasRequired(e => e.DealingDesk)
            .WithMany( s => s.DealingStatus)
            .HasForeignKey( s => s.DealingDeskId)
            .WillCascadeOnDelete(false);


        //modelBuilder.Entity<DealingDesk>()
        //    .HasMany(a => a.EmailAddress)
        //    .WithMany(b => b.)
        //    .Map(m =>
        //    {
        //        m.MapLeftKey("DealingDeskId");
        //        m.MapRightKey("EmailId");
        //        m.ToTable("LUDealingDeskEmail", "Blotter");

        //    });

            //modelBuilder.Entity<DealingDesk>()
            //     .HasMany<EmailAddress>(s => s.EmailAddress)
            //     .WithMany(c => c.DealingDesk)
            //     .Map(cs =>
            //     {
            //         cs.MapLeftKey("FK_DealingDeskId");
            //         cs.MapRightKey("FK_EmailId");
            //         cs.ToTable("Blotter.LUDealingDeskEmail");
            //     });

    }

问题是当我检索交易台对象时,我没有收到回复的电子邮件,上面写着错误说:

  

&#39;((System.Data.Entity.DynamicProxies.DealingDesk_B97FADE5FCA3BA8DED564B236CAB94E3462E9228525392A5055AE860F8156F86)   新   。System.Collections.Generic.Mscorlib_CollectionDebugView(dealingDesk).Items [1])EmailAddress的&#39;   抛出了类型的例外   &#39; System.Data.Entity.Core.EntityCommandExecutionException&#39;

也许我在看这个错误?

1 个答案:

答案 0 :(得分:0)

当我尝试访问外键对象时,我没有在查询结果序列上调用ToList()时出现此错误。这是一个例子:

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

class Entity
{
    public int Id{get;set;}
    public ForeignKeyObj KeyObj{get;set;}
}

以下是重现错误的代码:

var entities = (from e in _db.Entities
                                 where e.Id== 1
                                 select e).ToList();
foreach( var e in entities )
      Debug.WriteLine(e.KeyObj.Id.ToString());

如果将删除ToList()调用,则错误将在Debug.WriteLine()行中显示出来。将其添加回来,EF将填充外键对象。