Как отобразить дочернюю сущность на родительскую сущность, не вводя родительский компоновщик родительского типа в дочернюю сущность? - PullRequest
5 голосов
/ 03 августа 2011

У меня есть эти классы:

public class Product
{
    [Key]
    public virtual int ProductId { get; set; }
    public virtual string ProductName { get; set; }
    public virtual string Category { get; set; }

    public virtual IList<ProductPricing> ProductPriceList { get; set; }


    [Timestamp]
    public virtual byte[] Version { get; set; }
}

public class ProductPricing
{        

    // no ProductId here
    public virtual Product Product { get; set; }

    [Key]
    public virtual int ProductPricingId { get; set; }

    public virtual DateTime EffectiveDate { get; set; }
    public virtual decimal Price { get; set; }


}

Это моя модельBuilder:

modelBuilder.Entity<Product>().
    HasMany(x => x.ProductPriceList)
   .WithRequired()
   .HasForeignKey(x => x.Product);

Это ошибка:

Компонент внешнего ключа 'Product 'не является объявленным свойством по типу' ProductPricing '.Убедитесь, что оно не было явно исключено из модели и является допустимым примитивным свойством.

ОБНОВЛЕНИЕ

Я пробовал следующее, соответствующееошибки ниже кода

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired();

{"Неверное имя столбца 'Product_ProductId1'. \ r \ nНеверное имя столбца 'Product_ProductId'. \ r \ nНеверное имя столбца 'Product_ProductId1'."}

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired()
    .Map(x => x.MapKey("ProductId"));

{"Неверное имя столбца 'Product_ProductId'."}} 1026 *

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired(x => x.Product);

{"Неверное имя столбца 'Product_ProductId'. \ R \nНеверное имя столбца 'Product_ProductId'. "}

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired(x => x.Product)
    .Map(x => x.MapKey("ProductId"));

{" Нарушено ограничение множественности. Роль 'Product_ProductPriceList_Source' отношения 'TestEfCrud.Mappers.Product_ProductPriceList' имеет кратность 1 или 0..1. "}

Если это могло бы помочь, вот DDL:

create table Product
(
ProductId int not null identity(1,1) primary key,
ProductName varchar(100) not null,
Category varchar(100) not null,
Version rowversion not null
);

create table ProductPricing
(
ProductId int not null references Product(ProductId),
ProductPricingId int identity(1,1) not null primary key,
EffectiveDate datetime not null,
Price decimal(18,6) not null
);

ОБНОВЛЕНИЕ 2

У меня естьпопробовал этот ответ, который выглядит как бит , как в моем случае, отображение возникло из child entity Как сначала отобразить родительский столбец в коде EF 4.1

Однако, используя это:

modelBuilder.Entity<ProductPricing>()
    .HasOptional(x => x.Product)
    .WithMany()
    .Map(x => x.MapKey("ForeignKeyColumn"));

и это:

modelBuilder.Entity<ProductPricing>()
    .HasRequired(x => x.Product)
    .WithMany()
    .HasForeignKey(x => x.Product);

Обапривело к этой ошибке:

{"Неверное имя столбца 'Product_ProductId1'. \ r \ nНеверное имя столбца 'Product_ProductId1'. \ r \ nНеверное имя столбца 'Product_ProductId1'."}

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Я не понимаю, почему вы используете беглое отображение?Ваша модель должна отображаться по умолчанию.Если вы хотите отобразить его с помощью беглого отображения, используйте:

modelBuilder.Entity<Product>()
            .HasMany(x => x.ProductPriceList) // Product has many ProductPricings
            .WithRequired(y => y.Product)     // ProductPricing has required Product
            .Map(m => m.MapKey("ProductId")); // Map FK in database to ProductId column
2 голосов
/ 03 августа 2011

У этого есть правильный ответ:

http://agilenet.wordpress.com/2011/04/18/entity-framework-code-first-specify-foreign-key-name-in-one-to-many-relationship-with-fluent-api/

Я почти получил это:

modelBuilder.Entity<ProductPricing>()
    .HasRequired(x => x.Product)
    .WithMany()
    .Map(x => x.MapKey("ProductId"));

Я просто забыл поставить зависимую от принципала (т.е. ProductPriceList.Я надеюсь, что я получаю правильную терминологию, хотел держаться подальше от родительской дочерней терминологии ^ _ ^):

modelBuilder.Entity<ProductPricing>()
    .HasRequired(x => x.Product)
    .WithMany(x => x.ProductPriceList)
    .Map(x => x.MapKey("ProductId"));

Свободное отображение Entity Framework едва ли свободное владение , вы заикаетесьмог бы непреднамеренно совершить коммит, если вы не очень хорошо знакомы с нюансами каждого метода :-) Посмотрите, я почти все понял.Проходные значения ProductPricing и ProductPriceList выглядят излишними, едва интуитивными.

Свободное отображение EF вряд ли является хорошим беглым (из которых интуитивность должна быть врожденным качеством) гражданином интерфейса, не так ли?

...