2012-02-02 61 views
0

UPDATE: 我更新了类看起来更像我的实际模型。当我从文档基础实体中删除可分配属性时,一切正常。在Entity Framework 4.1中使用外键的抽象属性?

像这样可能在EF 4.1中映射?

public abstract class Entity 
{ 
    public Guid Id {get;set;} 
}  

public abstract class Assignable:Entity 
    { 

    } 

    public class Contact: Assignable 
    { 
     public string Name {get;set;} 
    } 

    public class Partner: Assignable 
    { 
     public string Area {get;set;} 
    } 

    public abstract class Document: Entity  { 

     public Guid AssignedToId {get;set} 
     public Assignable AssignedTo {get;set; 
    } 

    public class Submittal: Document 
    { 
     public string SomeProperty {get;set;} 
    } 

映射:

public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity> 
     where TEntity : Entity 
     { 
      protected EntityConfiguration() 
      { 
       HasKey(e => e.Id); 
       Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

      } 
     } 

    public class AssignableEntityMapping<TEntity>: EntityConfiguration<TEntity> where TEntity: Assignable 
{ 

} 
    public class DocumentEntityMapping<TEntity>: EntityConfiguration<TEntity> 
     { 
      public DocumentEntityMapping() 
      { 

       HasOptional(e => e.AssignedTo).WithMany().HasForeignKey(e => e.AssignedToId); 
      } 
     } 

public class ContactMapping: AssignableEntityMapping<Contact> 
{ 
.... 
} 

public class PartnerMapping: AssignableEntityMapping<Partner> 
{ 
.... 
} 

public class SubmittalMapping: DocumentEntityMapping<Submittal> 
{ 
.... 
} 

如果这是可能怎样安装的映射,使得AssignedToId是一个外键的混凝土实体之一?我为Document实体创建了一个映射,并且出现错误:“属性'Id'不是类型中的声明属性...”我猜这是因为EF不知道如何区分AssignedToId引用的内容?

+0

你根本不需要映射,它只是与约定一起工作。你创建的地图是什么? – Slauma 2012-02-02 15:21:53

+0

@Slauma:我更新了我的问题。我想我可能需要将可分配表与FKs分配给属于Type Assignable的任何属性。也许? – DDiVita 2012-02-02 16:07:22

+0

映射代码甚至无法编译,特别是对于'DocumentEntityMapping'。而'Document'有一个重复的'Id'。你使用TPH还是TPT继承?我试图重现你的例外,但我没有能力。 – Slauma 2012-02-02 17:00:49

回答

0

我在ContactPartner实体周围有很多额外的架构,我不能使用类似TPH (Table Per Hierarchy)的方法。 EF不知道如何映射Document类中的AssignedToId,因为我试图同时使用Table per Concrete Type (TPC)。我最终只是将所有“可分配”类型添加到Document类。如果还有其他解决方法,我想知道。

public abstract class Document: Entity 
{ 
    public Guid? AssignedContactId {get;set;} 
    public Contact AssignedContact {get;set;} 
    public Guid? AssignedPartnerId {get;set;} 
    public Partner AssignedPartner {get;set;} 
} 
相关问题