gpt4 book ai didi

c# - 影响 EF 代码中的外键列命名(CTP5)

转载 作者:可可西里 更新时间:2023-11-01 07:47:10 27 4
gpt4 key购买 nike

我有一个 POCO 类,它与另一个类有两个单向一元关系,两个类共享一个祖先。生成的模式中的外键名称不反射(reflect)属性名称。 (属性 MainContact 和 FinancialContact 提供 PersonId 和 PersonId1 字段名称)。

我如何影响架构生成以生成与属性名称匹配的数据库列名称?

模型看起来像这样:

The class model

代码如下所示:

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; }
}

架构如下所示: enter image description here

druttka的回答


druttka 在下面的回答完成了这项工作,很高兴知道这是背后的 CTP5 错误。 EF 还需要指定级联行为,我已经按照 druttka 给出的链接中的示例使用流畅的 API 来执行此操作。更多来自 Morteza Manavi 的精彩读物 here .

现在的代码是这样的:

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; }
}

现在给出了更合适的数据库: enter image description here

最佳答案

默认情况下,EF Code First 使用约定优于配置。但是,您可以通过覆盖 DbContent.OnModelCreating 来设置显式替代项。很多例子here , 由 ScottGu 提供。

编辑

所以在 CTP5 中,MapSingleType 消失了,如描述的那样here .以下适用于简单的字符串属性,但不适用于您的组织与人的关系。我很好奇并计划继续关注它,但与此同时,也许这会让您入门,或者其他人可以完成答案。

public class Person : Customer
{
[Column(Name="EmailAddress")]
public string Email { get; set; }
}

编辑 2

好的,这就明白了。找到答案 here .免责声明:我只验证了数据库模式是按预期创建的。我没有测试播种数据或进一步的 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; }
}

关于c# - 影响 EF 代码中的外键列命名(CTP5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5082991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com