繁体   English   中英

实体框架-Fluent API映射

[英]Entity Framework - Fluent API Mapping

public class Customer
{
    public int Id { get; set; }

    public int AddressId { get; set; }

    public virtual Address { get; set; }
}

public class Address
{
   public int Id { get; set; }

   public virtual Customer { get; set; }
}

客户必须强制提供一个地址。 一个地址可能有也可能没有客户。 地址中的“客户”导航属性类似于“可为空”。 我在Customer.AddressId表中具有唯一索引。

有什么方法可以使用流畅的API进行此映射?

编辑:

CREATE TABLE Address
(
    Id           INT NOT NULL IDENTITY PRIMARY KEY,
    AddressLine1 VARCHAR(50),
)

CREATE TABLE Customer
(
     Id         INT NOT NULL IDENTITY PRIMARY KEY,
     Name       VARCHAR(50) NOT NULL,
     AddressId  INT NOT NULL,
     CONSTRAINT FK_Customer_Address FOREIGN KEY(AddressId) REFERENCES Address (Id)
)

我重新创建了整个数据库和模型,并且能够将记录添加到客户表和地址表中。

基本上,如果一个客户可以只有一个地址,那么这意味着一个地址可以有0个或多个客户。 (不是0或1)理想。 但是由于您的唯一性限制,该地址总是以0或1个客户记录结尾。 但这是一个运行时约束,EF在设计时不知道这一点。 (我认为它不能完全掌握2向关系的唯一性规则)EF将“客户对客户”模型建模为0:N,并让运行时处理N永远不会大于1的事实。

这是因为想到了记录。

  1. 一个customerA记录,需要有一个AddressA记录
  2. 一个AddressB记录可以独立地插入到Address表中。
  3. “客户”表中的另一个“客户C”记录必须明确具有“地址”记录,并且该记录必须是“地址B”或“地址C”。 (由于唯一索引约束,它不能是AddressA)
  4. 一个AddressD记录可以独立地插入到Address表中。

因此,AddressA有1个客户记录,AddressD有0个客户记录。

现在的问题是,您的SQL Server知道一个客户记录只能有一个地址记录, 并且该地址记录必须是唯一的。

EF无法双向理解唯一性部分。 它知道客户只需要一个地址,但不能强制要求该地址必须唯一。 如果基础INSERT如果您尝试插入一个地址已经属于另一个客户的客户,则该错误自然会发生。 由于唯一性的限制,EF实际上在创建一个模型方面做得很好,客户与地址之间的比例为1:1。

但是因为它不能双向理解唯一性部分,所以它将多个客户映射到一个地址。 (0个或更多的客户,而不是0或1)

因此,您的映射需要如下所示:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Address>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.Address)
            .WillCascadeOnDelete(false);
    }

这样可以确保客户始终具有所需的地址实体,并且一个地址具有0个或更多客户。 (在实践中,由于唯一性约束,在该列表中始终只能得到0或1个客户),但不能在EF中强制实施。 您需要始终获取List<Customers>并且它将始终具有0或1个元素。

如果您尝试手动修改映射,并在地址和客户之间具有可选的0:1关系(而不是0:N),则EF会有些困惑,并由于某种原因开始引发IDENTITY插入异常。 不知道为什么。

因此您可以使用上述映射,并确保List<Customers>始终只有0或1条记录

提出了一些功能要求,以从两方面完全理解唯一性方面(我认为这转化为很好理解的关系代数)。 https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-ie-candidate-key-support

public class Customer
{
    public int Id { get; set; }
    public Address { get; set; }
}
public class Address
{
   public int Id { get; set; }
   public int? CustomerId { get; set; }
   public virtual Customer { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM