gpt4 book ai didi

c# - EF 多重关系

转载 作者:行者123 更新时间:2023-11-30 12:48:59 26 4
gpt4 key购买 nike

使用 Entity Framework 5

所以我有一个客户。客户可以有多个地址,但至少有一个。其中一个地址也将设置为主地址(必需)。我尝试了各种映射,但到目前为止,我在构建或为数据库播种时遇到错误。

客户:

public class Customer
{
public int CustomerId { get; set;}
public String CustomerName { get; set; }
public int PrimaryAddressId { get; set; }
public virtual CustomerAddress PrimaryAddress { get; set; }
public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
}

地址:

public class CustomerAddress : Address
{
public int CustomerAddressId { get; set; }
public int CustomerId { get; set; }
public virtual Customer Customer { get; set; }
}

我的这部分映射工作正常。它位于 CustomerAddress 上。

        this.HasRequired(c => c.Customer)
.WithMany(d => d.CustomerAddresses)
.HasForeignKey(c => c.CustomerId);

但是我如何指定正确的映射以在 Customer 中设置 PrimaryAddress?还是方法不对?

谢谢

编辑 - 同时使用 Arnolds 和 LueTM 的答案:

这段代码现在可以工作了。

客户:

public class Customer
{
public int CustomerId { get; set;}
public String CustomerName { get; set; }
// public int PrimaryAddressId { get; set; } created in mapping
public virtual CustomerAddress PrimaryAddress { get; set; }
public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
}

地址:

public class CustomerAddress : Address
{
public int CustomerAddressId { get; set; }
public int CustomerId { get; set; }
public virtual Customer Customer { get; set; }
}

客户映射:

        modelBuilder.Entity<Customer>
.HasOptional(c => c.PrimaryAddress)
.WithOptionalDependent().Map(m => m.MapKey("PrimaryAddressId"));

modelBuilder.Entity<Customer>
.HasMany(c => c.CustomerAddresses)
.WithRequired(c => c.Customer)
.HasForeignKey(c => c.CustomerId)
.WillCascadeOnDelete(false);

并且我使用存储库来确保首先创建并保存一个新地址,然后将其设置为主地址并再次保存。存储库确保主库是“必需的”。

最佳答案

由于您没有显示异常,我不得不假设您遇到了先有鸡还是先有蛋的问题。

如果将 PrimaryAddress 设置为必需属性,EF 必须具有现有地址 ID 才能建立外键(在 Customer 中设置 PrimaryAddressId) .但是,由于 Address 需要一个 Customer,因此您不能在其客户之前存储地址。而且,如果您尝试一次性保存地址和客户,EF 无法确定正确的插入顺序,因为它需要使用另一个对象的生成 ID 插入这两个对象。

因此 AddressCustomer 必须有一个可选的外键。

我会让 Customer.PrimaryAddressId 可选:

modelBuilder.Entity<Customer>().HasOptional(c => c.PrimaryAddress)
.WithOptionalDependent();

现在您可以存储地址并在单独的交易中为客户分配主地址。但是您需要业务逻辑来确保 Customer 始终具有主要地址。

如果您想在一次交易中保存客户和地址,一种方法是将 IsPrimary 属性(bool)添加到 CustomerAddress 并确保始终只有一个地址有 true

关于c# - EF 多重关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996314/

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