c# - ver - El esquema especificado no es válido. Errores: la relación no se cargó porque el tipo no está disponible
visual studio 2017 error list (7)
El error es un poco críptico, por lo que no estoy seguro de si esta es la razón por la que está recibiendo ese error en particular, pero sí sé que causará algún error, por lo que puede comenzar por corregir esto:
Lo que tienes son dos relaciones uno a varios con el mismo modelo en una clase. Eso no es un problema en sí mismo, pero hay que tratarlos por separado. En otras palabras, ambos no pueden tener una relación opuesta de Orders
, porque en relación, no hay manera de saber qué relación de clave externa debe llenar esa lista. Si simplemente cambia la definición de su API fluida a algo como .WithMany(t => t.Orders_Shipping)
y .WithMany(t => t.Orders_Billing)
, creo que eso aclarará su error.
Deseo hacer referencia al modelo OrderAddress
dos veces en mi modelo de Order
; una vez como ShippingAddress
y una vez como BillingAdress
.
Por otro lado, quiero que mi modelo OrderAddress
tenga una lista de OrderAddresses
.
Modelo OrderDdress
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; }
}
Modelo de pedido
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 fluida
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);
}
Cuando intento ejecutar Update-Database, aparece el siguiente error:
El esquema especificado no es válido. Errores: la relación ''MyApp.Domain.DAL.Order_ShippingAddress'' no se cargó porque el tipo ''MyApp.Domain.DAL.OrderAddress'' no está disponible.
¿Qué estoy haciendo mal?
En mi caso, tuve este error porque hice otra clase parcial con el mismo nombre que la clase generada por el marco de la entidad. Excepto el mío no coincidió con el caso. Por ejemplo:
public partial class Vehicle
{
public string Name { get; set; }
public string Make { get; set; }
...
}
public partial class VEhicle
{
public override bool Equals(object obj)
{
...
}
}
Esto es común en las entidades de auto-relación. en este caso:
1-Marque para tener colección ICollection, Lista, ... relación para cada relación.
2-comprobar el nombre de las colecciones de relaciones.
Primero el código de 3 pulgadas, verifique su EntityTypeConfiguration
Primero obtuve el mismo error al usar la base de datos: "La relación no se cargó porque el tipo ... no está disponible". El problema fue que el modelo en la solución estaba desactualizado. Para solucionar el problema:
- Haga doble clic en el archivo edmx en la solución.
- Haga clic derecho sobre él.
- Seleccione "Actualizar modelo de base de datos ...".
- Haga clic en la pestaña "Actualizar".
- Haga clic en el botón Finalizar.
Su edmx ahora debe actualizarse con los últimos cambios en la base de datos.
Tenía este problema. Creo que es algo que ver con el servicio web. Mi solución fue después de actualizar la referencia de servicio y se realizó la operación de configuración. el problema se fue espero que esto ayude.
Tengo una solución aquí! Si está utilizando EF entonces siga,
Abra model.edmx, luego haga clic derecho en él y actualice el modelo desde la base de datos. Finalmente construir la aplicación y ejecutarla.
OrderAddress
cambiar su entidad OrderAddress
y sus asignaciones de OrderAddress
API a lo siguiente:
OrdenDirección:
public class OrderAddress : BaseModel
{
...
public virtual ICollection<Order> BillingOrders { get; set; }
public virtual ICollection<Order> ShippingOrders { get; set; }
...
}
API fluida:
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);
}
Revisa este post SO para más, es casi el mismo problema que el tuyo.