Tom*_*mer 5 c# entity-framework fluent composite-key composite-primary-key
我正在尝试为实体映射复合键.
public class Customer
{
public int CustomerId { get; set; }
public virtual List<CustomerImage> CustomerImages { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它的地图:
public class CustomerMap : EntityTypeConfiguration<Customer>
{
public CustomerMap()
{
HasKey(t => t.CustomerId);
ToTable(DbConstants.k_CustomersImageTable);
}
}
Run Code Online (Sandbox Code Playgroud)
一个图像:
public class Image
{
public int ImageId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它的地图:
public class ImageMap : EntityTypeConfiguration<Image>
{
public ImageMap()
{
HasKey(t => t.ImageId);
ToTable(DbConstants.k_ImagesTable);
}
}
Run Code Online (Sandbox Code Playgroud)
和导航属性:
public class CustomerImage
{
public int CustomerId { get; set; }
public int ImageId { get; set; }
public virtual Customer CustomerRelated { get; set; }
public virtual Image ImageRelated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它的地图:
public class CustomerImageMap : EntityTypeConfiguration<CustomerImage>
{
public CustomerImageMap()
{
HasKey(t => new { t.CustomerId, t.ImageId });
Property(t => t.CustomerId).IsRequired().HasColumnOrder(0);
Property(t => t.ImageId).IsRequired().HasColumnOrder(1);
HasRequired(t => t.ImageRelated).WithMany().HasForeignKey(x => x.ImageId);
HasRequired(p => p.CustomerRelated)
.WithMany(p => p.CustomerImages)
.WillCascadeOnDelete(false);
ToTable(DbConstants.k_CustomersImageTable);
}
}
Run Code Online (Sandbox Code Playgroud)
但我一直得到以下例外:
在模型生成期间检测到一个或多个验证错误:
System.Data.Entity.Edm.EdmEntityType :: EntityType'CustomerImage'没有定义键.定义此EntityType的键.
System.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet'CustomerImages'基于类型'CustomerImage',没有定义键.
但是,如果我使用数据注释定义复合键,这不是很好,它可以完美地工作:
public class CustomerImage
{
[Key, Column(Order = 0)]
public int CustomerId { get; set; }
[Key, Column(Order = 1)]
public int ImageId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它的地图:
public class CustomerImageMap : EntityTypeConfiguration<CustomerImage>
{
public CustomerImageMap()
{
ToTable(DbConstants.k_CustomersImageTable);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了许多定义的变化,但似乎都没有.任何的想法?是EF虫子吗?
Tom*_*mer 10
事实证明,我只是忘了将地图放在DbContext上:
modelBuilder.Configurations.Add(new CustomerImageMap());
Run Code Online (Sandbox Code Playgroud)
也就是说,复合ID仍然没有以这种方式填充$元数据.因此,使用数据注释,这是生成的元数据:
<EntityType Name="CustomerImage">
<Key>
<PropertyRef Name="CustomerId"/>
<PropertyRef Name="ImageId"/>
</Key>
<Property Name="CustomerId" Type="Edm.Int32" Nullable="false"/>
<Property Name="ImageId" Type="Edm.Int32" Nullable="false"/>
<Property Name="LastUpdated" Type="Edm.DateTime"/>
<NavigationProperty Name="Customer" Relationship="EasyBizy.Entities.Models.EasyBizy_Entities_Models_CustomerImage_Customer_EasyBizy_Entities_Models_Customer_CustomerPartner" ToRole="Customer" FromRole="CustomerPartner"/>
<NavigationProperty Name="Image" Relationship="EasyBizy.Entities.Models.EasyBizy_Entities_Models_CustomerImage_Image_EasyBizy_Entities_Models_Image_ImagePartner" ToRole="Image" FromRole="ImagePartner"/>
</EntityType>
Run Code Online (Sandbox Code Playgroud)
但是,如果使用流畅的API而不是数据注释,则根本不会生成关键部分.为什么?
| 归档时间: |
|
| 查看次数: |
7874 次 |
| 最近记录: |