2013-01-18 91 views
3

在我的数据库,我已经叫一表“跟踪”与下列:实体框架:输入“映射为一个复合型”错误

[OrderNumber] [varchar](50) NULL, 
[TrackingNumber] [varchar](50) NULL, 
[emailaddress] [varchar](100) NULL, 
[courier] [varchar](10) NULL 

我有一个叫跟踪类来表示从实体表:

public class Tracking 
{ 
    public virtual string OrderNumber { get; set; } 
    public virtual string TrackingNumber { get; set; } 
    public virtual string EmailAddress { get; set; } 
    public virtual string Courier { get; set; } 
} 

在我的数据上下文

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new TrackingConfig()); 
} 

internal class TrackingConfig : EntityTypeConfiguration<Tracking> 
{ 
    internal TrackingConfig() 
    { 
     Property(x => x.OrderNumber); 
     Property(x => x.TrackingNumber); 
     Property(a => a.EmailAddress).HasColumnName("emailaddress"); 
     Property(a => a.Courier).HasColumnName("courier"); 
    } 
} 

的定义,你可以看到我没有实验值合法地将其作为复杂类型进行铸造。我甚至使用HasColumnName来指定哪些列名称映射到类的哪些属性,以防由于大小写不同而无法识别它们。 (我得到的错误不管是否使用了HasColumnName,因为事实证明。)

当我调用我设置的存储库时,出于任何原因,初始化失败,实体框架抛出异常:

The type 'Tracking' is mapped as a complex type. The Set method, DbSet objects, and DbEntityEntry objects can only be used with entity types, not complex types. 

我没有把它设置成一个复杂的类型......为什么EF4像对待它一样?

回答

1

看起来像是将字段声明为虚拟。您还可以使用数据注释来覆盖表名和列名以匹配您现有的数据库模式。以下是我将如何设置POCO模型和dbcontext。

[Table("tracking")] 
public class Tracking 
{ 
    public string OrderNumber { get; set; } 
    public string TrackingNumber { get; set; } 

    [Column(Name = "emailaddress")] 
    public string EmailAddress { get; set; } 

    [Column(Name = "courier")] 
    public string Courier { get; set; } 
} 

public class TrackingEntities : DbContext 
{ 
    public DbSet<Tracking> Trackings { get; set; } 
} 
+0

谢谢 - 删除虚拟和添加注释做了伎俩。我还注意到我的其他表中有一个模式不是“dbo”,必须在注释中设置它。 – AJH