Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实体框架中的表拆分为多个实体_C#_Entity Framework_Entity Framework 5 - Fatal编程技术网

C# 将实体框架中的表拆分为多个实体

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

问题出在这里。我有一个tableUser,其中有很多字段。我要做的是将此表拆分为多个实体,如下所示:

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的要点之一是将对象映射到数据库。对象的形状应该由应用程序域驱动,而数据库应该是数据库形状。举例来说,数据库中的多对多关系需要一个关联表,而这个关联表通常不应该映射到应用程序中的类。您有完整的例子吗?