Sea*_*ron 15 c# entity-framework code-first
我有一个POCO类,它与另一个类有两个单向一元关系,两个类共享一个祖先.生成的模式中的外键名称不反映属性名称.(属性MainContact和FinancialContact给出PersonId和PersonId1字段名称).
如何影响模式生成以生成与属性名称匹配的数据库列名?
该模型如下所示:

代码如下所示:
public class CustomerContext: DbContext
{
public DbSet<Organisation> Organisations { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>());
}
}
public abstract class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Person : Customer
{
public string Email { get; set; }
}
public class Organisation : Customer
{
public Person FinancialContact { get; set; }
public Person MainContact { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
架构如下所示:

druttka的回答完成了这项工作,很高兴知道这是一个CTP5错误.EF还需要指定级联行为,并且我使用了流畅的API来执行此操作,遵循druttka给出的链接中的示例.一些更良好的阅读从莫尔塔扎Manavi 这里.
代码现在是这样的:
public class CustomerContext : DbContext
{
public DbSet<Organisation> Organisations { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>());
builder.Entity<Organisation>()
.HasRequired(p => p.MainContact)
.WithMany()
.HasForeignKey(p => p.MainContactId)
.WillCascadeOnDelete(false);
builder.Entity<Organisation>()
.Property(p => p.MainContactId)
.HasColumnName("MainContact");
builder.Entity<Organisation>()
.HasRequired(p => p.FinancialContact)
.WithMany()
.HasForeignKey(p => p.FinancialContactId)
.WillCascadeOnDelete(false);
builder.Entity<Organisation>()
.Property(p => p.FinancialContactId)
.HasColumnName("FinancialContact");
}
}
public abstract class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Person : Customer
{
public string Email { get; set; }
}
public class Organisation : Customer
{
public Person FinancialContact { get; set; }
public int FinancialContactId { get; set; }
public Person MainContact { get; set; }
public int MainContactId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,它提供了更合适的数据库:

Dav*_*tka 10
默认情况下,EF Code First使用约定优于配置.但是,您可以通过覆盖DbContent.OnModelCreating来设置显式替代方案.这里有许多例子,由ScottGu提供.
编辑
所以在CTP5中,MapSingleType就像这里描述的那样消失了.以下适用于简单字符串属性,但不适用于您的组织与人员之间的关系.我很好奇,并打算继续关注它,但与此同时,也许这会让你开始或其他人可以完成答案.
public class Person : Customer
{
[Column(Name="EmailAddress")]
public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编辑2
好的,这就搞定了.在这里找到答案.免责声明:我只验证了数据库架构是按预期创建的.我没有测试播种数据或进一步的CRUD操作按预期工作.
public class Organisation : Customer
{
[Column(Name = "FinancialContact")]
public int? FinancialContactId { get; set; }
[ForeignKey("FinancialContactId")]
public Person FinancialContact { get; set; }
[Column(Name = "MainContact")]
public int? MainContactId { get; set; }
[ForeignKey("MainContactId")]
public Person MainContact { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12087 次 |
| 最近记录: |