Я пытаюсь обновить свои модели данных для библиотеки первого класса EF 5.0.0 -rc code -. Первая команда в методе Up ()—
DropForeignKey("dbo.ChileInventory", new[] { "LotInventoryItemTypeId", "ChileProductId" }, "dbo.ChileProducts");
. но я получаю SqlException :«FK _dbo.ChileInventory _dbo.ChileProducts _LotInventoryItemTypeId _ChileProductId» не является ограничением. Не удалось удалить ограничение.
Я думаю, что причина ошибки связана с тем, что мой класс ChileProducts получает ключевые свойства из своего базового класса. Поскольку нет перегрузки метода DropForeignkey, который принимает имя основного столбца (s ), я полагаю, что EF не может определить правильное ограничение для удаления. Я также должен отметить, что имя ограничения, отображаемое в сообщении об исключении, не совпадает с именем ограничения в базе данных (, отсюда и ошибка...)
Ниже вы найдете модели данных и методы миграции. Но сначала краткое примечание о характере изменений, стоящих за миграцией. :Каждый производный класс InventoryBase определяет тип продукта с помощью составного ключа InventoryTypeId и [InventoryTypeSpecific]ProductId. Например, ChileInventory идентифицирует свой конкретный тип типа чили как InventoryItemTypeId = [ChileInventoryTypeId] и ChileProductId = [ChileProductId]. PackagingInventory идентифицирует свой тип упаковки как InventoryItemTypeId = [PackagingInventoryTypeId] и PackagingProductId = [PackagingProductId]. И так далее.
Изменение модели, над развертыванием которого я работаю, — это повышение [InventoryTypeSpecific]ProductId из каждой производной InventoryBase в базу.Это приведет к тому, что все производные объекты InventoryBase будут совместно использовать общее свойство ProductId, которое в сочетании с InventoryItemTypeId позволит переходить от InventoryBase к ProductBase; что было невозможно в предыдущей модели.
Заранее спасибо за совет и внимание. --Винни
public abstract class ProductBase
{
[Key]
[Column(Order = 0)]
public virtual int InventoryItemTypeId { get; set; }
[Key]
[Column(Order = 1)]
public virtual int Id { get; set; }
[StringLength(150)]
public virtual string Name { get; set; }
[ForeignKey("InventoryItemTypeId")]
public virtual InventoryItemType InventoryItemType { get; set; }
public virtual bool IsActive { get; set; }
}
public class ChileProduct : ProductBase
{
public virtual int ChileTypeId { get; set; }
[ForeignKey("ChileTypeId")]
public virtual ChileType ChileType { get; set; }
}
public abstract class InventoryBase
{
[Key]
[Column(Order = 0, TypeName = "Date")]
public virtual DateTime DateCreated { get; set; }
[Key]
[Column(Order = 1)]
public virtual int Sequence { get; set; }
[Key]
[Column(Order = 2)]
public virtual int LotInventoryItemTypeId { get; set; }
[Column(TypeName = "Date")]
public virtual DateTime LotDateCreated { get; set; }
public virtual int LotSequence { get; set; }
public virtual int ProductId { get; set; }
[ForeignKey("LotInventoryItemTypeId, LotDateCreated, LotSequence")]
public virtual Lot Lot { get; set; }
[ForeignKey("LotInventoryItemTypeId")]
public virtual InventoryItemType ItemType { get; set; }
public virtual ICollection<InventoryQuantityByLocation> QuantitiesByLocation { get; set; }
[ForeignKey("LotInventoryItemTypeId, ProductId")]
public virtual ProductBase ProductBase { get; set; }
}
public class ChileInventory : InventoryBase
{
[Column(TypeName = "Date")]
public virtual DateTime? ProductionBatchDateCreated { get; set; }
public virtual int? ProductionBatchSequence { get; set; }
public virtual int PackagingInventoryItemTypeId { get; set; }
public virtual int PackagingProductId { get; set; }
[ForeignKey("ProductionBatchDateCreated, ProductionBatchSequence")]
public virtual ProductionBatch ProductionBatch { get; set; }
[ForeignKey("LotInventoryItemTypeId, ProductId")]
public virtual ChileProduct ChileProduct { get; set; }
[ForeignKey("PackagingInventoryItemTypeId, PackagingProductId")]
public virtual PackagingProduct PackagingProduct { get; set; }
}
public override void Up()
{
DropForeignKey("dbo.ChileInventory", new[] { "LotInventoryItemTypeId", "ChileProductId" }, "dbo.ChileProducts");
DropForeignKey("dbo.PackagingInventory", new[] { "LotInventoryItemTypeId", "PackageId" }, "dbo.PackagingProducts");
DropForeignKey("dbo.AdditiveInventory", new[] { "LotInventoryItemTypeId", "AdditiveProductId" }, "dbo.AdditiveProducts");
DropIndex("dbo.ChileInventory", new[] { "LotInventoryItemTypeId", "ChileProductId" });
DropIndex("dbo.PackagingInventory", new[] { "LotInventoryItemTypeId", "PackageId" });
DropIndex("dbo.AdditiveInventory", new[] { "LotInventoryItemTypeId", "AdditiveProductId" });
AddColumn("dbo.Inventory", "ProductId", c => c.Int(nullable: false));
AddForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts", new[] { "InventoryItemTypeId", "Id" });
AddForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts", new[] { "InventoryItemTypeId", "Id" });
AddForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts", new[] { "InventoryItemTypeId", "Id" });
AddForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts", new[] { "InventoryItemTypeId", "Id" });
CreateIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
CreateIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
CreateIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
CreateIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
DropColumn("dbo.ChileInventory", "ChileProductId");
DropColumn("dbo.PackagingInventory", "PackageId");
DropColumn("dbo.AdditiveInventory", "AdditiveProductId");
}
public override void Down()
{
AddColumn("dbo.AdditiveInventory", "AdditiveProductId", c => c.Int(nullable: false));
AddColumn("dbo.PackagingInventory", "PackageId", c => c.Int(nullable: false));
AddColumn("dbo.ChileInventory", "ChileProductId", c => c.Int(nullable: false));
DropIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
DropIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
DropIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
DropIndex("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" });
DropForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts");
DropForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts");
DropForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts");
DropForeignKey("dbo.Inventory", new[] { "LotInventoryItemTypeId", "ProductId" }, "dbo.AdditiveProducts");
DropColumn("dbo.Inventory", "ProductId");
CreateIndex("dbo.AdditiveInventory", new[] { "LotInventoryItemTypeId", "AdditiveProductId" });
CreateIndex("dbo.PackagingInventory", new[] { "LotInventoryItemTypeId", "PackageId" });
CreateIndex("dbo.ChileInventory", new[] { "LotInventoryItemTypeId", "ChileProductId" });
AddForeignKey("dbo.AdditiveInventory", new[] { "LotInventoryItemTypeId", "AdditiveProductId" }, "dbo.AdditiveProducts", new[] { "InventoryItemTypeId", "Id" });
AddForeignKey("dbo.PackagingInventory", new[] { "LotInventoryItemTypeId", "PackageId" }, "dbo.PackagingProducts", new[] { "InventoryItemTypeId", "Id" });
AddForeignKey("dbo.ChileInventory", new[] { "LotInventoryItemTypeId", "ChileProductId" }, "dbo.ChileProducts", new[] { "InventoryItemTypeId", "Id" });
}