实体框架 - 如何在一侧映射所需属性而在另一侧没有导航属性

时间:2016-01-21 08:07:02

标签: c# .net entity-framework

我有以下两个POCO(ProductUser)和一个复杂类型(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

我怎么能

  1. 映射TrackingInfo复杂类型
  2. 映射CreatedBy - &gt;用户单向关系?

2 个答案:

答案 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的导航属性}}