OrderAddress
モデルでOrder
モデルを参照したいtwice 1回はShippingAddress
として、もう1回はBillingAdress
として。
一方、OrderAddress
モデルにはOrderAddresses
のリストが必要です。
public enum AddressType
{
Billing,
Shipping,
Contact
}
public class OrderAddress : BaseModel
{
public AddressType AddressType { get; set; }
public bool IsPrimary { get; set; }
public string Address { get; set; }
public string CityStateZip { get; set; }
public string ContactName { get; set; }
public string PhoneNumber { get; set; }
public string FaxNumber { get; set; }
public string EmailAddress { get; set; }
public virtual ICollection<Order> Orders { get; set; }
public virtual ApplicationUser User { get; set; }
}
public class Order : BaseModel
{
public DateTime OrderDate { get; set; }
public int BillingAddressId { get; set; }
public virtual OrderAddress BillingAddress { get; set; }
public int ShippingAddressId { get; set; }
public virtual OrderAddress ShippingAddress { get; set; }
public virtual ApplicationUser User { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Order>()
.HasRequired(m => m.ShippingAddress)
.WithMany(t => t.Orders)
.HasForeignKey(m => m.ShippingAddressId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Order>()
.HasRequired(m => m.BillingAddress)
.WithMany(t => t.Orders)
.HasForeignKey(m => m.BillingAddressId)
.WillCascadeOnDelete(false);
}
Update-Databaseを実行しようとすると、次のエラーが表示されます。
指定されたスキーマは無効です。エラー:タイプ「MyApp.Domain.DAL.OrderAddress」が使用できないため、関係「MyApp.Domain.DAL.Order_ShippingAddress」はロードされませんでした。
私は何を間違えていますか?
エラーは少しわかりにくいので、これがあなたがその特定のエラーを受け取っている理由であるかどうかはわかりませんが、それがsomeエラーを引き起こすことはわかっているので、これを修正することから始めることができます:
あるのは、1つのクラスの同じモデルに対する2つの1対多の関係です。それ自体は問題ではありませんが、別々に扱う必要があります。言い換えると、両者はOrders
の逆の関係を持つことはできません。これは、関係的に、どの外部キー関係がそのリストに入力されるべきかを知る方法がないためです。流れるようなAPI定義を.WithMany(t => t.Orders_Shipping)
や.WithMany(t => t.Orders_Billing)
のようなものに変更するだけで、エラーは解消されると思います。
OrderAddress
エンティティとFluent APIマッピングを次のように変更する必要があります。
OrderAddress:
public class OrderAddress : BaseModel
{
...
public virtual ICollection<Order> BillingOrders { get; set; }
public virtual ICollection<Order> ShippingOrders { get; set; }
...
}
Fluent API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Order>()
.HasRequired(m => m.ShippingAddress)
.WithMany(t => t.ShippingOrders)
.HasForeignKey(m => m.ShippingAddressId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Order>()
.HasRequired(m => m.BillingAddress)
.WithMany(t => t.BillingOrders)
.HasForeignKey(m => m.BillingAddressId)
.WillCascadeOnDelete(false);
}
これを確認してください SO post 詳細については、あなたと同じ問題です。
私の場合、エンティティフレームワークによって生成されたクラスと同じ名前の別の部分クラスを作成したため、このエラーが発生しました。私を除いて、ケースは一致しませんでした。例えば:
public partial class Vehicle
{
public string Name { get; set; }
public string Make { get; set; }
...
}
public partial class VEhicle
{
public override bool Equals(object obj)
{
...
}
}
これは、自己関係エンティティで一般的です。この場合:
1-各リレーションにICollection、List、...リレーションコレクションがあることを確認します。
2-関係コレクションの名前を確認します。
3-inコードを最初に、EntityTypeConfigurationを確認します
この問題がありました。これはWebサービスと関係があると思います。私の解決策は、サービス参照を更新し、構成操作が行われた後です。問題はなくなりました。お役に立てれば。
最初にデータベースを使用して同じエラーが発生しました:「タイプ...が使用できないため、関係がロードされませんでした」。問題は、ソリューションのモデルが古くなっていたことです。問題を修正するには:
これで、edmxが最新のデータベース変更で更新されます。