1

私は2つのテーブルを持っています

  • StoreOrderItem
  • StoreOrder

StoreOrder には多くの StoreOrderItems があり、StoreOrderItem には 1 つの StoreOrder があります (単純な 1 対多の関係)。

public class StoreOrderItemMap : EntityTypeConfiguration<StoreOrderItem>
{
        public StoreOrderItemMap()
        {
            this.ToTable("StoreOrderItem");
            this.HasKey(op => op.Id);
            this.Property(op => op.StoreOrderId).HasColumnName("order_id");
            ...

            this.HasRequired(so => so.StoreOrder)
              .WithMany(soi => soi.StoreOrderItems)
              .HasForeignKey(so => so.StoreOrderId);
        }
}

public class StoreOrderMap : EntityTypeConfiguration<StoreOrder>
{
    public StoreOrderMap()
    {
        this.ToTable("StoreOrder");
        this.HasKey(op => op.Id);
        ....
    }
}

public class StoreOrderItem
{
    ....
    public virtual int StoreOrderId { get; set; }
    ....

    public virtual StoreOrder StoreOrder { get; set; }
}

public class StoreOrder
{
    .... 
    private ICollection<StoreOrderItem> _storeOrderItems;
    ....

    public virtual ICollection<StoreOrderItem> StoreOrderItems
    {
        get { return _storeOrderItems ?? (_storeOrderItems = new List<StoreOrderItem>()); }
        set { _storeOrderItems = value; }
    }

}

//The code which is used to add the configurations to the modelBuilder.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    System.Type configType = typeof(ContentMap);   //any of your configuration classes here
    var typesToRegister = Assembly.GetAssembly(configType).GetTypes()
        .Where(type => !String.IsNullOrEmpty(type.Namespace))
        .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
        foreach (var type in typesToRegister)
        {
            dynamic configurationInstance = Activator.CreateInstance(type);
            modelBuilder.Configurations.Add(configurationInstance);
        }
        base.OnModelCreating(modelBuilder);
}

このコードを既存の DB で実行していることに注意してください。「StoreOrder_Id」を選択せず​​、代わりに既存の列「order_id」を使用するように EF に指示するにはどうすればよいですか?

エラーは次のとおりです。

「/」アプリケーションでサーバー エラーが発生しました。

列名「StoreOrder_Id」が無効です。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.Data.SqlClient.SqlException: 列名 'StoreOrder_Id' が無効です。

4

1 に答える 1

1

数日間の気の迷いの末に問題を発見……

StoreOrder クラスに別のプロパティがありました

public virtual IList<StoreOrderItem> NonVoucherOrderItems
{
    get
    {
        return this.StoreOrderItems.Where(x => !x.IsVoucher()).ToList();
    }
}

これは評価が早すぎてあらゆる種類の混乱を引き起こしていたため、次のように変更されました。

public virtual IEnumerable<StoreOrderItem> NonVoucherOrderItems
{
    get
    {
        return this.StoreOrderItems.Where(x => !x.IsVoucher());
    }
}

そしてすぐに効きました!!

于 2012-10-11T00:35:03.343 に答える