Указанная схема недействительна. Ошибки: связь не была загружена, потому что тип недоступен
Я хочу ссылаться на OrderAddress
модель дважды в моей модели Order
; один раз как ShippingAddress
и один раз как BillingAdress
.
С другой стороны, я хочу, чтобы моя модель OrderAddress
имела список OrderAddresses
.
Модель OrderAddress
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; }
}
Свободный API
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.Order_ShippingAddress" не было загружено, потому что тип "MyApp.Domain.DAL.OrderAddress" недоступен.
Что я делаю неправильно?
Ответы
Ответ 1
Ошибка немного загадочна, поэтому я не уверен, что именно по этой причине вы получаете эту конкретную ошибку, но я знаю, что это приведет к некоторой ошибке, поэтому вы можете начать с исправления:
У вас есть два отношения "один ко многим" к одной и той же модели на одном классе. Это не проблема сама по себе, но вы должны рассматривать их как отдельные. Другими словами, они не могут иметь противоположное отношение Orders
, потому что реляционно, нет способа узнать, какие отношения внешнего ключа должны заполнять этот список. Если вы просто измените свое текущее определение API на что-то вроде .WithMany(t => t.Orders_Shipping)
и .WithMany(t => t.Orders_Billing)
, я думаю, что это устранит вашу ошибку.
Ответ 2
Вам нужно изменить свой объект OrderAddress
и ваши сопоставления Fluent API на следующее:
OrderAddress:
public class OrderAddress : BaseModel
{
...
public virtual ICollection<Order> BillingOrders { get; set; }
public virtual ICollection<Order> ShippingOrders { get; set; }
...
}
Свободный 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 > , это примерно такая же проблема, как ваша.
Ответ 3
У этой проблемы. Я считаю, что это как-то связано с веб-сервисом. Мое решение состоялось после обновления справочной службы и операции конфигурации. проблема исчезла. надеюсь, что это поможет.
Ответ 4
В моем случае у меня была эта ошибка, потому что я сделал еще один неполный класс с тем же именем, что и класс, сгенерированный инфраструктурой entity. Кроме моего не было случая. Например:
public partial class Vehicle
{
public string Name { get; set; }
public string Make { get; set; }
...
}
public partial class VEhicle
{
public override bool Equals(object obj)
{
...
}
}
Ответ 5
Сначала я получил ту же ошибку, что и база данных: "Отношения не были загружены, потому что тип... недоступен". Проблема заключалась в том, что модель в решении устарела. Чтобы устранить проблему:
- Дважды щелкните файл edmx в разделе "Решение".
- Щелкните правой кнопкой мыши по нему.
- Выберите "Обновить модель из базы данных...".
- Перейдите на вкладку "Обновить".
- Нажмите кнопку "Готово".
Теперь ваш edmx должен быть обновлен с последними изменениями базы данных.
Ответ 6
Это обычное явление в объектах самоопределения. в этом случае:
1-check, чтобы иметь коллекцию связей ICollection, List,... для каждого отношения.
2-проверить имя коллекций отношений.
3-в коде сначала проверьте свой EntityTypeConfiguration
Ответ 7
У меня есть одно решение здесь!
если вы используете EF, выполните следующие действия:
Открыть model.edmx
затем щелкните правой кнопкой мыши по нему и обновите модель из базы данных.
наконец, создайте приложение и запустите его.