我有这些课程:
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'。“}
答案 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)
这是正确的答案:
我几乎得到了它:
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几乎不会流利,如果你不熟悉每种方法的细微差别,你可能无意中提交了一些口吃:-)看来,我几乎把它弄错了。传递ProductPricing
和ProductPriceList
看起来多余,几乎不直观。