【问题标题】:Entity Framework Code First Mapping Issue实体框架代码优先映射问题
【发布时间】:2013-12-22 14:29:28
【问题描述】:

我正在尝试在现有数据库上创建模型。

我目前有以下实体映射:

public class TripDriverMap : EntityTypeConfiguration<TripDriver>
{
    public TripDriverMap()
    {
        // Primary Key
        this.HasKey(t => t.TripDriverMapID);

        // Properties
        // Table & Column Mappings
        this.ToTable("slx_TripDriverMap");
        this.Property(t => t.TripDriverMapID).HasColumnName("TripDriverMapID");
        ...
        this.Property(t => t.DriverID).HasColumnName("EntityID");

        // Relationships
        ...
        this.HasRequired(t => t.Driver)
            .WithMany(t => t.TripDrivers)
            .HasForeignKey(d => d.DriverID);
        ...
    }
}

public class DriverMap : EntityTypeConfiguration<Driver>
{
    public DriverMap()
    {
        // Primary Key
        this.HasKey(t => t.ID);

        ...

        this.Property(t => t.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        this.Property(t => t.OwnerEntityID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        // Table & Column Mappings
        this.ToTable("slx_vw_Drivers");
        ...
        this.Property(t => t.ID).HasColumnName("EntityID");
        ...
    }
}

如果您仔细观察,我有一个名为 EntityID 的列,我已将其映射到属性 DriverID。每当我尝试从任一方包含相关实体时,都会收到以下错误:

列名“EntityPerson_EntityPersonID”无效。

这是因为正在生成的部分SQL如下:

[Extent1].[EntityPerson_EntityPersonID] AS [EntityPerson_EntityPersonID]
FROM  [dbo].[slx_TripDriverMap] AS [Extent1]
INNER JOIN [dbo].[slx_vw_Drivers] AS [Extent2] ON [Extent1].[EntityID] = [Extent2].[EntityID]

如您所见,它正在寻找一个名为 EntityPerson_EntityPersonID 的列,该列不存在。 它确实加入了正确的列

我无法重命名 TripDriverMap 表中的列,因为它在很多地方都在使用,包括在数据库、应用程序和报告中。

我怎样才能让它工作?我已经完成了我认为在 TripDriverMap 映射定义中必须做的所有事情

【问题讨论】:

    标签: entity-framework entity-framework-5


    【解决方案1】:

    而不是像这样指定您的 TripDrive-Driver 关系

    this.HasRequired(t => t.Driver)
            .WithMany(t => t.TripDrivers)
            .HasForeignKey(d => d.DriverID);
    

    尝试显式定义外键名称

    this.HasRequired(t => t.Driver)
            .WithMany(t => t.TripDrivers)
            .Map(m => m.MapKey("EntityPersonID"));
    

    【讨论】:

    • 很遗憾,这不起作用 - 我收到一条错误消息,提示该属性已被定义。
    • 当您添加带有MapHasRequired 时,您是否删除了DriverIDthis.Property 声明?否则这个错误是正确的。
    【解决方案2】:

    问题是由另一个类 EntityPerson 上定义的属性引起的,该类具有 TripDriver 对象的集合。当我删除该集合时,因为它不再需要正确生成的 SQL。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2011-04-21
      • 2012-05-18
      相关资源
      最近更新 更多