gpt4 book ai didi

c# - EF6 代码优先 : Using Fluent API to declare a Foreign Key

转载 作者:太空狗 更新时间:2023-10-30 00:52:28 26 4
gpt4 key购买 nike

我正在使用 EF 6 和 Code First 开发与保险行业相关的应用程序。对于这个应用程序,每个帐户可以有多个策略,每个策略可以有多个交易。此外,每个帐户必须与身份(姓名、地址、城市等)有关系。 Policy 也与 Identity 有关系,但它是可选的。

由于帐户 -> 身份和帐户 -> 策略 -> 身份,我发现我需要使用 Fluent API 将至少其中一个路径的 WillCascadeDelete 设置为 False。

我的问题是如何将 Account.IdentityId 和 Policy.InsuredIdentityId 属性配置为外键?我已经避免向标识类添加任​​何导航/外键字段,因为永远没有理由从一个标识导航到另一个类。这就是我很难弄明白的原因吗?

public class Account
{
public long Id { get; set; }
public long IdentityId { get; set; }
public virtual Identity Identity { get; set; }

public ICollection<Policy> Policies { get; set; }
}

public class Policy
{
public long Id { get; set; }

public long AccountId { get; set; }
public virtual Account Account { get; set; }

public bool UseAccountIdentity { get; set; }
public long InsuredIdentityId { get; set; }
public virtual Identity InsuredIdentity { get; set; }
}

public class Identity
{
public long Id { get; set; }

public string Name { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}

public class AccountConfiguration : EntityTypeConfiguration<Account>
{
public AccountConfiguration()
{
HasRequired(a => a.Identity).WithOptional(x => x.Account).WillCascadeOnDelete(false);
HasMany(a => a.Policies).WithRequired(p => p.Account).HasForeignKey(p => p.AccountId);
}
}

public class PolicyConfiguration : EntityTypeConfiguration<Policy>
{
public PolicyConfiguration()
{
HasOptional(p => p.InsuredIdentity).WithOptionalPrincipal().WillCascadeOnDelete(false);
}
}

作为附带问题,EF Code First 是否有任何好的书籍或其他引用资源?我有 Julia Lerman 的 Programming Entity Framework: Code First,对于它确实涵盖的示例来说很好,但它没有涵盖足够的案例。

最佳答案

首先,public ICollection<Policy> Policies { get; set; }应该是 public virtual ICollection<Policy> Policies { get; set; } .

只有当关系的一侧是一而另一侧是多时,您才能映射 EF 外键属性。任何时候你有 1:1 或 1:0..1 关系,从属实体将采用与委托(delegate)人相同的主键。在这些情况下,不能有外键,因为依赖项的外键是其主键。

所以对于这个:

HasRequired(a => a.Identity).WithOptional(x => x.Account)

...帐户的 ID 将与身份的 ID 具有相同的值。意思是,您可以完全删除 IdentityId来自 Account 的属性(property)实体。但是我不明白该代码是如何编译的,因为 Identity没有 Account导航属性..?

当谈到您的政策映射时,这真的是您想要的方式吗?你说政策可以与身份有可选关系,但你这样做的方式是:

HasOptional(p => p.InsuredIdentity).WithOptionalPrincipal()

...意味着 Identity只能相关(直接)做一个Policy .使映射看起来像这样有什么问题?

HasOptional(p => p.InsuredIdentity).WithMany()
.HasForeignKey(x => x.InsuredIdentityId)
.WillCascadeOnDelete(false);

有了上面的内容,您仍然没有来自 Identity 的任何导航属性至 Policy .你不需要一个,你可以调用 .WithMany()作为无参数。然而,这告诉数据库设置 Identity作为校长,Policy作为依赖,所以你在数据库中有正常的 fk 关系,但你仍然无法导航到 Policy来自 Identity在代码中。

其他评论:

The Policy also has a relationship to an Identity, but it is optional.

这意味着Policy.InsuredIdentityId应该是 System.Nullable<long> .

关于c# - EF6 代码优先 : Using Fluent API to declare a Foreign Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21152966/

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