如何在不在子实体中引入原始类型父链接器的情况下将子实体映射到父实体?

时间:2011-08-03 06:53:14

标签: entity-framework mapping entity-framework-4.1

我有这些课程:

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; }


}

这是我的modelBuilder:

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'。”}

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

我尝试过这个答案,它看起来与我的情况类似的,映射来自子实体 How to map parent column in EF 4.1 code first

然而,使用这个:

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 个答案:

答案 0 :(得分:4)

我不明白你为什么要使用流畅的映射?您的模型应按默认约定进行映射。如果您想使用流畅的映射映射它:

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

答案 1 :(得分:2)

这是正确的答案:

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"));

实体框架的Fluent Mapping几乎不会流利,如果你不熟悉每种方法的细微差别,你可能无意中提交了一些口吃:-)看来,我几乎把它弄错了。传递ProductPricingProductPriceList看起来多余,几乎不直观。

EF的流畅映射几乎不是一个很好的流利(其中直觉应该是天生的质量)接口公民,不是吗?