我正在使用 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/