实体框架TPC外键关系



所以我已经实现每个具体类以处理继承层次结构,但是我在导航属性方面遇到了麻烦。

我的模型是结构如下:

我有一个抽象的基本类别,带有多个派生类,因此:

public abstract class BaseEntity
{
    public virtual ICollection<Comment> Comments { get; set; }
    public EntitytType EntitytType { get; set; }
}
public class FirstDerivedEntity : BaseEntity
{
    //EntitytType == First;
}
public class SecondDerivedEntity : BaseEntity
{
    //EntitytType == Second;
}
public class Comment
{
    public long BaseEntityId { get; set; }
    public EntitytType BaseEntityType { get; set; }
}
public enum EntitytType
{
    First,
    Second
}

这里的注释导航属性无效,因为每个派生(混凝土)类都有自己的ID集。在我看来

任何帮助将不胜感激!

为了使TPC工作的解决方案将是派生类中的ID,不仅在其表中而且在两个表中都是唯一的。

您可以使用数据库解决方案,例如具有不同初始种子的自动增量主键或SQL Server中的GUID键。

中的键。

另一种方法是在您的应用程序代码中生成唯一的GUID密钥。您可以看到如何建模以下实体的相同示例代码:

namespace tpc_so
{
    public class tpc_soContext : DbContext
    {
        public tpc_soContext()
        {
        }
        public DbSet<BaseEntity> BaseEntities { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BaseEntity>().HasKey(b => b.BaseEntityId);
            modelBuilder.Entity<BaseEntity>()
           .Property(b => b.BaseEntityId)
           .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            modelBuilder.Entity<FirstDerivedEntity>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("FirstDerivedEntities");
            });
            modelBuilder.Entity<SecondDerivedEntity>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("SecondDerivedEntities");
            });

            modelBuilder.Entity<Comment>().ToTable("Comments");
            base.OnModelCreating(modelBuilder);
        }
    }
    public abstract class BaseEntity
    {
        public Guid BaseEntityId { get; set; }
        public virtual ICollection<Comment> Comments { get; set; }
    }
    public class FirstDerivedEntity : BaseEntity{}
    public class SecondDerivedEntity : BaseEntity{ }
    public class Comment
    {
        public long CommentId { get; set; }
        public Guid BaseEntityId { get; set; }
        public string Text { get; set; }
    }
}

并创建某些实体使用以下代码:

using (var ctx = new tpc_soContext())
{
    ctx.BaseEntities.Add(new FirstDerivedEntity()
    {
        BaseEntityId = Guid.NewGuid(),
        Comments = new List<Comment>() { new Comment() { Text = "First Derived Comment" } }
    });
    ctx.BaseEntities.Add(new SecondDerivedEntity()
    {
        BaseEntityId = Guid.NewGuid(),
        Comments = new List<Comment>() { new Comment() { Text = "Second-Derived Comment" } }
    });
    ctx.SaveChanges();
}

TPC的一些很好的来源将在这里:

[首先使用EF代码继承:第3部分 - 每个混凝土类型(TPC)]

[实体框架 - 每个混凝土表]

最新更新