1

尝试在基类中设置 ForeignKeyAttribute 时出错

class User { }

abstract class FruitBase
{    
   [ForeignKey("CreateById")]
   public User CreateBy{ get; set; }

   public int CreateById{ get; set; }     
}

class Banana : FruitBase { }

class DataContext : DbContext
{    
   public DbSet<Banana> Bananas { get; set; }
}

如果我将 FruitBase 代码移动到香蕉中,一切都很好,但我不想这样做,因为会有很多水果,如果可以的话,我想保持相对干燥

这是一个将在 3 月之前解决的已知问题吗?有谁知道解决方法?

4

2 回答 2

2

问题是由于在您的 DbContext 中放置DbSet<Banana>而不是DbSet<FruitBase>. 以下对象模型按预期工作:

public class User 
{
    public int UserId { get; set; }
}

public abstract class FruitBase
{
    public int Id { get; set; }
    public int CreateById { get; set; }

    [ForeignKey("CreateById")]
    public User CreateBy { get; set; }
}

public class Banana : FruitBase { }

public class DataContext : DbContext
{        
    public DbSet<FruitBase> Fruits { get; set; }                
}

您必须知道,这样做实际上是在创建多态关联,并且从 CTP5 开始,并非所有继承映射策略都允许多态关联。在这里它工作正常,因为您使用了Table per Hierarchy (TPH)

更新:按类型使用表 (TPT)策略:

多态关联也适用于 TPT:

public class StackoverflowTestContext : DbContext
{
    public DbSet<FruitBase> Fruits { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Banana>().ToTable("Bananas");
    }         
}
于 2011-01-16T16:42:01.100 回答
0

如上所述,这是 TPC(每个具体类型的表),这里的答案/解决方法是将 ForeignKeyAttribute 从基础中取出

class User{}

abstract class AuditObjectBase{ // was FruitBase

   // [ForeignKey("CreateById")]
   public abstract User CreateBy{ get; set; } // made abstract

   public int CreateById{ get; set; } // both get and set required public

}

class ItemOne : AuditObjectBase{ // Was Banana

   // added
   [ForeignKey("CreateById")]
   public override User CreateBy{ get; set; }
}

class ItemTwo : AuditObjectBase{ // Added

   [ForeignKey("CreateById")]
   public override User CreateBy{ get; set; }
}

class DataContext : DbContext{

   DbSet<ItemOne> ItemOnes{ get; set; }
   DbSet<ItemTwo> ItemTwos{ get; set; }
}

不是完全干的,但至少当你创建一个使用 AuditObjectBase 的对象时,它会强制你实现外键属性,一些很好的评论来提醒你这个属性,然后你就走了

基本上它接缝,属性应该添加到在 DbContext 中声明为实体的类,在这种情况下具有 DbSet 属性。

于 2011-01-17T09:33:28.870 回答