【问题标题】:Entity Framework 4 mapping issue实体框架 4 映射问题
【发布时间】:2011-02-07 23:32:54
【问题描述】:

我和我的朋友在使用 Code First Fluent API 在 Entity Framework 4 CTP 5 中定义映射时遇到了一些困难,我希望有人能指出我们正在犯的一些明显的愚蠢错误。以下是相关的数据库设置:

Person
------------
int PersonId (pk)
varchar Name

Contact
--------------
int ContactId (pk)
int ContactTypeId
varchar Text

因此,一个人可以有零个或多个电话号码和零个或多个电子邮件地址。电话和电子邮件地址存储在“Contact”表中,这是一个简单的按层次结构的表继承映射(以 ContactTypeId 作为类型鉴别符)。在代码中,我们有:

public class Person {
    public int PersonId { get; set; }
    public string Name { get; set; }
    public ICollection<Phone> Phones { get; set; }
    public ICollection<Email> Emails { get; set; }
}

public abstract class Contact {
    public int ContactId { get; set; }
    public string Text { get; set; }
    public Person Person
}

public class Phone : Contact {}    
public class Email : Contact {}

...对于我们拥有的数据库映射:

public class ContactMapping : IFluentEntityFrameworkMapping
{
    public void OnModelCreating(ModelBuilder modelBuilder)
    {
        EntityTypeConfiguration<Contact> configuration = modelBuilder.Entity<Contact>();

        config.HasKey(c => c.ContactId)
            .Map<Email>(e => e.Requires("ContactTypeId").HasValue(1))
            .Map<Phone>(p => p.Requires("ContactTypeId").HasValue(2));
    }
}

public class PersonMapping : IFluentEntityFrameworkMapping
{
    public void OnModelCreating(ModelBuilder modelBuilder)
    {
        EntityTypeConfiguration<Person> config = modelBuilder.Entity<Person>();

        config.HasMany(p => p.Phones).WithRequired(p => p.Person).HasForeignKey(p => p.PersonId);
        config.HasMany(p => p.Emails).WithRequired(e => e.Person).HasForeignKey(e => e.PersonId);
    }
}

当我们尝试对这些东西运行简单的单元测试时,如果我们只是尝试拉回电话号码或电子邮件地址的集合,一切都很好。但是,如果我们尝试拉取一组 Persons,就会出现映射错误。上面的代码有什么明显的问题吗?

提前感谢您的帮助, 库尔特C

【问题讨论】:

    标签: entity-framework-4 entity-framework-ctp5


    【解决方案1】:

    该例外来自您试图在 Contact 类上与一个端点创建 2 个关联这一事实。换句话说,Contact.Person 是 Person.Phones 和 Person.Emails 的逆属性,这是不可能的,至少在 EF CTP5 中是这样。这是解决此问题的一种方法:

    public class Person 
    {
        public int PersonId { get; set; }
        public string Name { get; set; }                
        public ICollection<Contact> Contacts { get; set; }
    }
    
    public abstract class Contact 
    {
        public int ContactId { get; set; }
        public string Text { get; set; }
        public int PersonId { get; set; }        
        public Person Person { get; set; }
    }
    
    public class Phone : Contact { }
    public class Email : Contact { }
    
    public class Context : DbContext
    {
        public DbSet<Contact> Contacts { get; set; }
        public DbSet<Person> Persons { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Contact>()
                        .Map<Email>(e => e.Requires("ContactTypeId").HasValue(1))
                        .Map<Phone>(p => p.Requires("ContactTypeId").HasValue(2));
    
            modelBuilder.Entity<Person>()
                        .HasMany(p => p.Contacts)
                        .WithRequired(e => e.Person)
                        .HasForeignKey(e => e.PersonId);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多