gpt4 book ai didi

asp.net-mvc - Entity Framework TPC 继承(现在请拍我)

转载 作者:行者123 更新时间:2023-12-01 05:25:32 26 4
gpt4 key购买 nike

我正在尝试根据 http://www.schema.org 上定义的实体构建一个实体模型和数据库。使用 Code First 和迁移。底线是所有实体都继承自实体“事物”。

迁移会构建数据库,但任何对数据库进行种子设定的尝试都会失败。

一切都继承自 Thing:

    namespace Entities.Models
{
public class Thing
{
public Thing()
{
Id = Guid.NewGuid();
Name = String.Empty;
}

public Guid Id { get; set; }
public virtual string Name { get; set; }

}

public class Person : Thing
{
public Person()
: base()
{
Friends = new List<Person>();
}

public string GivenName { get; set; }
public string FamilyName { get; set; }
public string Email { get; set; }

public virtual ICollection<Person> Friends { get; set; }
}

public class Event : Thing
{
public Event()
: base()
{
Attendees = new List<Person>();
}

public virtual ICollection<Person> Attendees { get; set; }
public TimeSpan Duration { get; set; }
public DateTime? endDate { get; set; }
public DateTime? StartDate { get; set; }

}

public class ThingMap : EntityTypeConfiguration<Thing>
{
public ThingMap()
{
// Primary Key
this.Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

// Properties
this.Property(t => t.Name)
.IsOptional()
.HasMaxLength(200);

// Table & Column Mappings
this.ToTable("entity_Thing");
}
}
public class PersonMap : EntityTypeConfiguration<Person>
{
public PersonMap()
{
// Properties
this.Map<Person>(t =>
{
t.MapInheritedProperties();
t.ToTable("entity_Person");
});

// Table & Column Mappings
}
}

public class EventMap : EntityTypeConfiguration<Event>
{
public EventMap()
{
// Properties
this.Map<Event>(t =>
{
t.MapInheritedProperties();
t.ToTable("entity_Event");
});

// Table & Column Mappings
}
}

public class CitriusSpotsContext : DbContext
{
static CitriusSpotsContext()
{
Database.SetInitializer<CitriusSpotsContext>(null);
}

public CitriusSpotsContext()
: base("Name=CitriusSpotsContext")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ThingMap());
modelBuilder.Configurations.Add(new PersonMap());
modelBuilder.Configurations.Add(new EventMap());
}

public DbSet<Thing> Things { get; set; }
public DbSet<Person> People { get; set; }
public DbSet<Event> Events { get; set; }
}

}

最佳答案

我目前正在使用类似的模型,我知道这个答案很晚,但它可能会有所帮助。

首先,TPH、TPT 和 TPC 是在我们的数据库中建模继承的机制。如果我们不需要为多态查询、更新或保存建模继承,我们不需要遵循 TP* 约定。

让我重申一下。 TPH、TPT 和 TPC 是可选的数据库继承建模策略。如果我们的应用程序不需要多态查询、更新或插入,我们不需要遵循 TP* 约定。

我的基本项目设置与您的非常相似。在我的项目中,我有一个抽象类,项目中的每个类都继承自该类。它被命名为XModelBase我相信它对应于您的Thing类(class)。

我使用这个抽象类来实现一些将我的 biz 规则验证连接到 Entity Framework 的验证机制的基本方法。该类还确保为每个实体捕获审计值,并且该类包含其他通用属性 (KeyId),并为通用流程提供原型(prototype)/模板。

我们的模型之间唯一真正的区别是我的 XModelBase有一个 int当您使用 Guid 时,作为主键(所有类随后继承)的数据类型主键的数据类型。

如果我是正确的,您和我将永远不需要执行如下查询:

场景一:

var query = from t in context.Things select t;

这种类型的查询在我们的场景中没有意义。为什么我们要选择数据库中的每个对象?我们不会也不会

我们也永远不会通过我们的抽象类保存对象,例如:

场景二:
var person = new Person() {Email = "something@somewhere.com"};
context.Things.Add(person);

相反,我们只是这样做:

场景三:
var person = new Person() {Email = "something@somewhere.com"};
context.People.Add(person);

因为我们不需要容纳 Scenario 1Scenario 2 , 我们不需要 Things成为一个单独的基表(TPT)。我们也不需要或不想以 TPC 的不可见多态方式访问或保存我们的子类表;因此,当您考虑它时,我们真的永远不需要以下属性:
public DbSet<Thing> Things { get; set; }

当我们想要/需要对多态关联建模时,我们只需要在我们的对象上下文中使用这个 DbSet 属性。

从我们的上下文中删除该属性并摆脱我们对基类的模型配置是继承自由的第一步。

接下来,我们将删除 MapInheritedProperties()从我们的子类模型配置中,因为继承的属性将自动映射。我们只是离开我们的 .ToTable指定我们的子类对象。

同样,我有一个 int对于我的 XModelBase基类主键,所以我可以简单地用 [Key] 标记它属性如:
[Key]
public int KeyId { get; set; }

但是因为我没有创建表或使用 DbSet对于我的 XModelBase类,所有继承的子类都将具有独立的自动递增主键,这些主键配置为 [Key]我的 XModelBase 中的属性类(class)。

如果我正确理解了您的问题,那么这些信息应该会为您指明正确的方向,但如果我没有解决您的问题,我很想知道您最终是如何解决这些问题的。

希望这可以帮助!

关于asp.net-mvc - Entity Framework TPC 继承(现在请拍我),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14022522/

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