Отношение один ко многим с EF 4.1 Code First - база данных использует вместо триггеров - PullRequest
0 голосов
/ 12 декабря 2011

Сначала мы работаем над кодом EF, чтобы оценить, соответствует ли он нашей существующей базе данных. Структура базы данных объектов:

1) Продукт (составной ключ)

int Идентификатор продукта: PK (без идентификации) - создается автоматически вместо триггера int Version From: PK (Non Identity) - создается автоматически вместо триггера

2) Пакет (составной ключ)

PackID: PK (без идентификации) - автоматически генерируется вместо триггера Версия от: PK (Non Identity) - автоматически создается вместо триггера Идентификатор продукта: (не может быть установлен как FK - ограничение дизайна)

RelationShip: продукт имеет много упаковок

Как мы можем смоделировать вышеописанный сценарий с EF Code First 4.1?


Решение, которое пытался

public class Product
{
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public short Version { get; set; }
        public virtual ICollection<Pack> Packs { get; set; }
}

public class Pack
{
        public int PackID { get; set; }
        public int ProductID { get; set; }
        public short Version { get; set; }
        public virtual Product Product { get; set; }
}
public class ProductContext : DbContext
{
    public DbSet<Pack> Pack { get; set; }
    public DbSet<Product> Product { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Product>().ToTable("Product");
        modelBuilder.Entity<Pack>().ToTable("Pack");

        modelBuilder.Entity<Product>()
                    .HasKey(a => new { a.ProductID, a.VersionFrom });

        modelBuilder.Entity<Pack>()
                    .HasKey(a => new { a.PackID, a.VersionFrom });

        modelBuilder.Entity<Product>().HasMany<Pack>(x => x.Packs).WithRequired().HasForeignKey(p => p.ProductID);

        base.OnModelCreating(modelBuilder);
    }
}

....

var product = new Product { ProductName = "EntTest1"};
var pack = new Pack {};


            using (var productContext = new ProductContext())
            {

                product.Packs.Add(pack);
                productContext.Product.Add(product);
                productContext.SaveChanges(); //**ERROR**
            }

....

Во время генерации модели была обнаружена одна или несколько ошибок проверки:

System.Data.Edm.EdmAssociationConstraint: : Number of Properties in the Dependent and Principal Role in a relationship constraint must be exactly identical.

Пожалуйста, ПОМОГИТЕ !!!

1 Ответ

1 голос
/ 12 декабря 2011

Вашему Pack классу нужны два скалярных свойства внешнего ключа

public class Pack
{
        public int PackID { get; set; }
        public int ProductID { get; set; }
        public short ProductVersion { get; set; }
        public virtual Product Product { get; set; }
}

Необходимо указать оба скалярных свойства для сопоставления

modelBuilder.Entity<Product>()
.HasMany<Pack>(x => x.Packs).WithRequired(p => p.Product)
.HasForeignKey(p => new { p.ProductID, p.ProductVersion});

Редактировать: Без отображения скалярных свойств

public class Pack
{
        public int PackID { get; set; }
        public virtual Product Product { get; set; }
}

modelBuilder.Entity<Product>()
.HasMany<Pack>(x => x.Packs).WithRequired(p => p.Product)
.Map(m => m.MapKey("ProductID", "ProductVersion"));

Ваша таблица Pack(s) должна иметь столбцы ProductID, ProductVersion с соответствующими типами данных.

...