gpt4 book ai didi

c# - Entity Framework TPC 外键关系

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:59 25 4
gpt4 key购买 nike

所以我实现了每个具体类的表来处理继承层次结构,但我在导航属性方面遇到了问题。

我的模型结构如下:

我有一个抽象的 BaseEntity 类,有多个派生类,所以:

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
}

此处的 Comments 导航属性不起作用,因为每个派生(具体)类都有自己的一组 ID。在我看来,每个表中的 EntityType 列将用作某种鉴别器,但我不知道如何告诉 EF 如此使用它。

如有任何帮助,我们将不胜感激!

最佳答案

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

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

另一种方法是在您的应用程序代码中生成唯一的 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 的一些好的资源会在这里:

[Inheritance with EF Code First: Part 3 – Table per Concrete Type (TPC)]

[Entity Framework - Table Per Concrete]

关于c# - Entity Framework TPC 外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42518831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com