C# 将实体框架中的表拆分为多个实体
问题出在这里。我有一个tableUser,其中有很多字段。我要做的是将此表拆分为多个实体,如下所示:C# 将实体框架中的表拆分为多个实体,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,问题出在这里。我有一个tableUser,其中有很多字段。我要做的是将此表拆分为多个实体,如下所示: User -> GeneralDetails -> CommunicationDetails -> Address etc. 当从用户提取一些字段到一般细节时,一切都很顺利。但是,当我尝试对通信详细信息执行相同操作时,EF崩溃,需要在一般详细信息和通信详细信息之间建立一对一的关系 实体定义示例: public class User { public in
User
-> GeneralDetails
-> CommunicationDetails
-> Address
etc.
当从用户提取一些字段到一般细节时,一切都很顺利。但是,当我尝试对通信详细信息执行相同操作时,EF崩溃,需要在一般详细信息和通信详细信息之间建立一对一的关系
实体定义示例:
public class User {
public int UserId { get; set; }
public string SomeField1 { get; set; }
public int SomeField2 { get; set; }
public virtual GeneralDetails GeneralDetails { get; set; }
public virtual CommunicationDetails CommunicationDetails { get; set; }
public virtual Address Address { get; set; }
}
public class GeneralDetails {
[Key]
public int UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public virtual User User { get;set; }
}
public class CommunicationDetails {
[Key]
public int UserId { get; set; }
public string Phone { get; set; }
public string DeviceToken { get; set; }
public virtual User User { get;set; }
}
public class Address {
[Key]
public int UserId { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Street { get; set; }
public virtual User User { get;set; }
}
样本映射:
modelBuilder.Entity<User>().
HasRequired(user => user.GeneralDetails).
WithRequiredPrincipal(details => details.User);
modelBuilder.Entity<User>().
HasRequired(user => user.CommunicationDetails).
WithRequiredPrincipal(details => details.User);
modelBuilder.Entity<User>().
HasRequired(user => user.Address).
WithRequiredPrincipal(details => details.User);
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<GeneralDetails>().ToTable("Users");
modelBuilder.Entity<Address>().ToTable("Users");
modelBuilder.Entity()。
HasRequired(用户=>user.GeneralDetails)。
WithRequiredPrincipal(details=>details.User);
modelBuilder.Entity()。
HasRequired(用户=>user.CommunicationDetails)。
WithRequiredPrincipal(details=>details.User);
modelBuilder.Entity()。
HasRequired(用户=>user.Address)。
WithRequiredPrincipal(details=>details.User);
modelBuilder.Entity().ToTable(“用户”);
modelBuilder.Entity().ToTable(“用户”);
modelBuilder.Entity().ToTable(“用户”);
EF到底为什么想要这种关系?有什么方法可以解决这个问题吗?正确的方法是使用复杂类型,而不是实体。这实际上是一个比你想象的更普遍的问题
public class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelbuilder.ComplexType<CommunicationDetails>();
modelbuilder.ComplexType<GeneralDetails>();
modelbuilder.ComplexType<Address>();
modelbuilder.Entity<User>().ToTable("Users");
}
}
公共类MyDbContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelbuilder.ComplexType();
modelbuilder.ComplexType();
modelbuilder.ComplexType();
modelbuilder.Entity().ToTable(“用户”);
}
}
看起来您的users表已经正确标准化,一旦正确标准化,就意味着您应该能够将它们作为一个实体来获取。将此表拆分为三个表的事实表明,在数据库中可能只需要三个不同的表。这只是一个建议,如果我错了,请纠正我。@Srb1313711我不同意。OR/M的要点之一是将对象映射到数据库。对象的形状应该由应用程序域驱动,而数据库应该是数据库形状。举例来说,数据库中的多对多关系需要一个关联表,而这个关联表通常不应该映射到应用程序中的类。您有完整的例子吗?