我有以下两个POCO(Product
和User
)和一个复杂类型(Tracking
)。
class Product() {
Guid Id { get; protected set; }
Tracking TrackingInfo { get; protected set; }
// Some other properties
}
class User() {
Guid Id { get; protected set; }
// Some other properties
}
class Tracking() {
User CreatedBy { get; protected set; }
Guid CreatedById { get; protected set; }
// Some other properties
}
跟踪类是跟踪信息的包装器,包含其他跟踪属性(创建日期,更新等)并为其他目的实现接口,但是现在我关心的是映射产品之间的关系{{1 }和TrackingInfo
。
每个User
必须有一个关联的Product
,映射到User
属性。
问题在于我不想在用户上创建导航属性回到产品 - 即我不想拥有TrackingInfo.CreatedBy
属性。
我不确定如何在EntityFramework Code First中完成关系或复杂类型映射。我有一个映射类如下:
ICollection<Product> ProductsCreated
我怎么能
答案 0 :(得分:2)
复杂类型不能包含导航属性。我建议创建一个包含Tracking
属性及其配置的抽象基类:
public abstract class Tracking
{
public Guid CreatedById { get; set; }
public virtual User CreatedBy { get; set; }
}
public abstract class TrackingConfig<T> : EntityTypeConfiguration<T> where T: Tracking
{
public TrackingConfig()
{
HasRequired( t => t.CreatedBy )
.WithMany()
.HasForeignKey( t => t.CreatedById );
}
}
public class Product : Tracking
{
public Guid Id { get; set; }
}
public class ProductConfig : TrackingConfig<Product>
{
public ProductConfig()
{
}
}
...
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
base.OnModelCreating( modelBuilder );
modelBuilder.Configurations.Add( new ProductConfig() );
答案 1 :(得分:1)
如果您不想要导航属性,请不要定义它们:
public ProductMap()
{
this.HasRequired(p => p.Tracking)
.WithMany()
.HasForeignKey(p => p.TrackingId);
}
通过这种方式,您可以通过Tracking
访问产品的用户,但是您无法从用户那里获取产品,因为{{1}中没有定义Product
的导航属性}}