多对多映射不起作用 - EF 4.1 RC

时间:2011-03-24 18:35:57

标签: c# entity-framework .net-4.0 ef-code-first entity-framework-4.1

更新经过一番研究后,似乎我的多对多映射的数量无法正常工作。嗯...

我正在将数据访问项目从EF 4.1 CTP4升级到EF 4.1 RC,我遇到了新的EntityTypeConfiguration<T>设置问题。

具体来说,我遇到了多对多关系的问题。我在尝试获取Sequence contains no elements项时遇到.First()异常。

特殊的例外并不是那么有趣。所有它说的是没有项目我知道集合中应该有项目 - 所以我的新映射必定存在问题。

这是我到目前为止的代码:

产品型号

public class Product : DbTable
{
    //Blah

    public virtual ICollection<Tag> Categories { get; set; }

    public Product()
    {
        //Blah
        Categories = new List<Tag>();
    }
}

BaseConfiguration

public class BaseConfiguration<T> : EntityTypeConfiguration<T> where T : DbTable
{
    public BaseConfiguration()
    {
        this.HasKey(x => x.Id);
        this.Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.Property(x => x.UpdatedOn);
        this.Property(x => x.CreatedOn);
    }
}

ProductConfiguration

public class ProductConfiguration : BaseConfiguration<Product> 
{
    public ProductConfiguration()
    {
        this.ToTable("Product");

        //Blah

        this.HasMany(x => x.Categories)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("Tag_Id");
                m.MapRightKey("Product_Id");
                m.ToTable("ProductCategory");
            });
    }
}

以前的CTP4映射工作!

this.HasMany(x => x.Categories)
    .WithMany()
    .Map("ProductCategory", (p, c) => new { Product_Id = p.Id, Tag_Id = c.Id  });

任何人都可以看到需要修理的东西吗?如果您希望我提供更多代码,请与我们联系。

编辑:更多代码

DBTABLE

public class DbTable : IDbTable
{
    public int Id { get; set; }
    public DateTime UpdatedOn { get; set; }
    public DateTime CreatedOn { get; set; }
}

代码

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Slug { get; set; }
    public bool Visible { get; set; }
    public virtual TagType TagType { get; set; }
}

TagConfiguration

public class TagConfiguration : EntityTypeConfiguration<Tag>
{
    public TagConfiguration()
    {
        this.ToTable("Tags");

        this.HasKey(x => x.Id);
        this.Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnName("tag_id");
        this.Property(x => x.Name).HasMaxLength(300).HasColumnName("tag_name");
        this.Property(x => x.Slug).HasMaxLength(500).HasColumnName("tag_slug");
        this.Property(x => x.Visible).HasColumnName("tag_visible");
        this.HasRequired(x => x.TagType).WithMany(tt => tt.Tags).Map(m => m.MapKey("tagtype_id"));
    }
}

是的,这是一个具有命名约定up to boohai的旧数据库。

我知道Tag类必须正确连接,因为Product有另一个属性Specialization,它也映射到Tag并正确加载。但要注意它是以一对多的方式映射的。所以似乎是Tag的多对多。

我会开始检查是否有任何多对多关联正在运作。

2 个答案:

答案 0 :(得分:1)

您需要指定两个导航属性以执行多对多映射。

尝试在指向产品的WithMany属性中添加lambda:

this.HasMany(x => x.Categories)
            .WithMany(category=>category.Products)
            .Map(m =>
            {
                m.MapLeftKey(t => t.TagId, "Tag_Id");
                m.MapRightKey(t => t.ProductId, "Product_Id");
                m.ToTable("ProductCategory");
            });

(交叉手指......)

答案 1 :(得分:0)

我还没有使用Code-First方法,但在使用POCO时我必须启用Lazy-Loading,才能使导航属性正常工作。这当然是设计的,但我不知道你是否必须为Code-First明确启用此行为。