entity-framework - EF 代码第一个 : Treating entity like a complex type (denormalization)

标签 entity-framework mapping ef-code-first entity-framework-4.1

我正在使用 EF 4.1 Code First,并且正在制作一个可配置实用程序来解析/导入大型分隔文件。文件中的每一行可能包含多个实体的数据。

文件的确切数据和布局在构建时是未知的(每个客户端的配置不同),因此我将其设置为可配置的。

示例模型(简化)

public class Contact {
    public int Id { get; set;}
    public string Name { get; set; }
}

public class Account {
    public int Id { get; set; }
    public decimal Balance { get; set; }
    public bool IsOpen { get; set; }
}

文件可能包含联系信息、帐户信息或两者,具体取决于客户。由于这些文件的大小(大量记录),我们必须使用 SqlBulkCopy 来加载数据。在编译时也不知道将针对数据运行哪些规则(客户端的验证更改等)

我想要一个表和类,例如 ImportRecord,来保存导入的数据。我现在的工薪阶层是这样的:

public class ImportRecord {
    public string Contact_Name { get; set; }
    public decimal Account_Balance { get; set; }
    public bool Account_IsOpen { get; set; }
}

这里的问题是,当我们在模型类中添加/更改字段时,ImportRecord 也必须更改——它是重复的/不太理想。对我来说,导入数据驻留在单个表中以简化 SqlBulkCopy 导入有点重要。

我理想的 ImportRecord 类如下所示:

public class ImportRecord {
    public Contact Contact { get; set; }
    public Account Account { get; set; }
}

但这只会创建一个带有两个外键的表(除了提示没有 FK 属性之外)。有没有办法让实体类的行为更像 ImportRecord 的非规范化、无键、复杂类型?我的想法完全错误吗?

谢谢!

最佳答案

实体不能嵌套,同时复杂类型不能有实体键,因此您不能使用一个实体键来代替另一个实体键,但您可以尝试这个小作弊。我刚刚测试它至少创建了正确的数据库结构:

public class Context : DbContext
{
    public DbSet<Account> Accounts { get; set; }
    public DbSet<Contact> Contacts { get; set; }
    public DbSet<ImportRecord> ImportRecords { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.ComplexType<ContactBase>();
        modelBuilder.ComplexType<AccountBase>();
    }
}

public class ContactBase
{
    public string Name { get; set; }
}

public class AccountBase
{
    public decimal Balance { get; set; }
    public bool IsOpen { get; set; }
}

public class Contact : ContactBase
{
    public int Id { get; set; }
}

public class Account : AccountBase
{
    public int Id { get; set; }
}

public class ImportRecord
{
    public int Id { get; set; }
    public ContactBase Contact { get; set; }
    public AccountBase Account { get; set; }
}

关于entity-framework - EF 代码第一个 : Treating entity like a complex type (denormalization),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6192809/

相关文章:

mysql - hibernate 列类型问题(MySql)

scala - HList 上的类型级映射

entity-framework - 如何预编译 Entity Framework 代码优先查询?

c# - 将 JSON 数据对象存储到 ASP.NET MVC( Entity Framework )中的数据库

c# - 使用 IRepository 和彼此的 ASP.NET C# 服务

asp.net - 如何批量更新用户的安全印章? Asp.net 身份

entity-framework - 无法为无法识别的元素提供者检索元数据

elasticsearch - not_analyzed索引的 Elasticsearch dynamic_templates

c# - 值不能为空;参数名称 : constructor when using SqlExecuteQuery with an abstract Entity model

entity-framework - EF CodeFirst 出现循环或多级联路径错误