C# 实体框架-Fluent API映射

C# 实体框架-Fluent API映射,c#,entity-framework,ef-fluent-api,C#,Entity Framework,Ef Fluent Api,客户必须有强制性的地址。地址可能有客户,也可能没有客户。Address中的Customer导航属性类似于“nullable”。我在Customer.AddressId表中有一个唯一的索引 是否有任何方法可以使用fluent API进行映射 编辑: 我重新创建了整个datatabase和模型,并能够向customer和address表中添加记录 基本上,如果一个客户可以有一个地址,那么这意味着一个地址可以有0个或多个客户。(不是0或1)理想情况下。 但是,由于您的唯一性约束,该地址总是以0或1个客

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

是否有任何方法可以使用fluent API进行映射

编辑:


我重新创建了整个datatabase和模型,并能够向customer和address表中添加记录

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

这是因为想想这些记录

  • customerA记录需要有AddressA记录
  • AddressB记录可以独立插入到地址表中
  • Customer表中的另一个CustomerC记录需要有一个地址记录,并且该记录需要是AddressB或AddressC。(由于唯一索引约束,它不能是AddressA)
  • AddressD记录可以独立插入到地址表中
  • 所以AddressA有1个客户记录,AddressD有0个客户记录

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

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

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

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

    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)
    )
    
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    
    实体

    我重新创建了整个datatabase和模型,并且能够向customer和address表中添加记录

    基本上,如果一个客户可以有一个地址,那么这意味着一个地址可以有0个或多个客户(理想情况下不是0或1)。 但由于您的唯一性约束,该地址始终只会有0或1条客户记录。但这是一个运行时约束,EF在设计时不知道这一点。(我认为它无法完全掌握双向关系的唯一性规则)EF将把客户的地址建模为0:N,并让运行时处理N永远不会超过1的事实

    这是因为想想这些记录

  • customerA记录需要有AddressA记录
  • AddressB记录可以独立插入到地址表中
  • Customer表中的另一个CustomerC记录肯定需要有一个地址记录,并且该记录必须是AddressB或AddressC。(由于唯一索引约束,它不能是AddressA)
  • AddressD记录可以独立插入到地址表中
  • 所以AddressA有1个客户记录,AddressD有0个客户记录

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

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

    但由于它不能双向理解唯一性部分,它将多个客户映射到单个地址。(0个或多个客户,而不是0或1)

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

    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)
    )
    
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    
    modelBuilder.Entity

    可能在那里我尝试了所有示例,但是仍然没有得到…我认为没有办法映射它可能在那里我尝试了所有示例,但是仍然没有得到…我认为没有办法映射这个{“当identity_insert设置为OFF时,无法在表'Address'中为identity列插入显式值”。}我不知道是否可以清楚地解释这种情况。客户必须有一个强制的地址。地址可能有客户,也可能没有客户。address中的客户导航属性为“nullable”.我在Customer.AddressId表中有一个唯一的索引。您是否编辑了该问题以更改客户地址顺序..不确定我的答案为什么是反向的..再试一次now@ViniciusGonçalves你能为这两个表发布你的表定义吗?我会先用EF代码设置数据库,然后为你解决这个问题。我编辑了我的问题并添加了定义初始化,tks很多。{“当identity_insert设置为OFF时,无法在表'Address'中插入identity列的显式值。”}我不知道是否可以清楚地解释这种情况。客户必须强制拥有地址。地址可能有客户,也可能没有客户。Address中的客户导航属性为“nullable”.我在Customer.AddressId表中有一个唯一的索引。您编辑了que吗
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Address>()
                .HasMany(e => e.Customers)
                .WithRequired(e => e.Address)
                .WillCascadeOnDelete(false);
        }
    
    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; }
    }