【问题标题】:EF CTP5 mapping problem when using a Entity base class使用实体基类时的 EF CTP5 映射问题
【发布时间】:2011-02-23 11:52:04
【问题描述】:

当涉及到基类时,我在 EF CTP5 中遇到了多对多关系的奇怪问题。我将首先向您展示一个有效的简单映射。

我有以下两个类(实体):

public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Process> Processes { get; set; }
}

public class Process
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

还有我的映射类:

public class ProductMapping : EntityTypeConfiguration<Product>
{
    public ProductMapping()
    {
        ToTable("Products");
        HasKey(t => t.ID);

        Property(t => t.ID).HasColumnName("product_id");
        Property(t => t.Name).HasColumnName("name");
    }
}

public class ProcessMapping : EntityTypeConfiguration<Process>
{
    public ProcessMapping()
    {
        ToTable("Processes");
        HasKey(t => t.ID);

        Property(t => t.ID).HasColumnName("process_id");
        Property(t => t.Name).HasColumnName("name");

        HasMany(p => p.Products)
            .WithMany(p => p.Processes)
            .Map(m =>
            {
                m.ToTable("Product_processes");
                m.MapLeftKey(process => process.ID, "process_id");
                m.MapRightKey(product => product.ID, "product_id");
            });     
    }
}

此映射完美运行。 但是,我想为我的实体引入一个基类。因此,作为开始,我创建了以下基类:

public abstract class Entity
{
    public int ID { get; set; }
}

我让我的两个实体 ProductProcess 继承自这个 Entity 基类,当然还从每个类中删除了 ID 属性。所以这两个实体是相同的,只是 ID 属性现在在基类中实现。

编译并运行我的项目后,我收到以下“著名的”EF 运行时错误:

“序列包含多个匹配元素”

我知道这个错误与多对多关联有关,因为如果我从Process 类中删除多对多映射,一切都会正常运行,但当然没有关联。

谁能看出这里有什么问题?这是 CTP5 错误还是我的实现有问题?如果结果是错误,您有解决方法的建议吗?

【问题讨论】:

    标签: entity-framework-4 mapping code-first ef-code-first


    【解决方案1】:

    我遇到了同样的问题,只是多对一关联。见this answer

    简而言之:在解决此问题之前不要使用基实体类;您可以使用接口代替 Id 属性。

    【讨论】:

    • 我担心这就是问题所在。但感谢您确认 Diego。你知道 MS 是否知道这个错误,是否会在 RTM 中修复?
    • @TommyJakobsen:我不知道;我在论坛里问过,但还没有得到答案。
    • 看来问题现在已经解决了,所以我会接受这个答案来关闭线程。
    猜你喜欢
    • 2011-06-04
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多