繁体   English   中英

实体框架代码优先的一对一关系

[英]One to One relationship in Entity Framework Code First

我有一个作为CustomerRequest的父表,该表与贷款表之间的关系为1到1-0,这意味着客户请求在贷款表中可以有1或0个贷款。 我首先在实体框架代码中获得正确的关系时遇到问题。

这是具有正确关系的“我的CustomerRequest表”脚本:

CREATE TABLE [Loan].[CustomerRequest]
(
 [Id]               INT IDENTITY(1,1)
,[CorrelationId]    VARCHAR(500)
,[CustomerNumber]   BIGINT
....

 CONSTRAINT PK_CustomerRequest PRIMARY KEY([Id])
)

这是贷款表:

 CREATE TABLE [Loan].[Loan]
 (
   [Id]                             INT    IDENTITY(1,1)
   ,[CustomerRequestId]             INT
   .....
 CONSTRAINT PK_Loan PRIMARY KEY([Id])
   ,CONSTRAINT FK_Loan_CustomerRequestId FOREIGN KEY([CustomerRequestId])  REFERENCES [Loan].[CustomerRequest]([Id])
 )

这是我的客户请求模型:

  public class CustomerRequest
{
    public int Id { get; set; }
    public string CorrelationId { get; set; }
    .....        
    public virtual Loan Loan { get; set; }
}

和贷款模型:

  public class Loan
   {
    public int Id { get; set; }
    public int CustomerRequestId { get; set; }
    ....
    public virtual CustomerRequest CustomerRequest { get; set; }
      }

我在CustomerRequestMap中具有以下关系:

    HasKey(t => t.Id).HasOptional(t => t.Loan).WithRequired(t => t.CustomerRequest);

当我尝试插入贷款表时出现此错误:

 {"Cannot insert explicit value for identity column in table 'Loan' when IDENTITY_INSERT is set to OFF."}

您必须像这样修改您的实体和配置。

public class CustomerRequest
{
    public int Id { get; set; }
    public string CorrelationId { get; set; }
    public virtual Loan Loan { get; set; }
}

public class CustomerRequestMap : EntityTypeConfiguration<CustomerRequest>
{
    public CustomerRequestMap()
    {
        Property(x => x.Id)
            .IsRequired()
            .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
    }
}

public class Loan
{
    //public int Id { get; set; }
    [Key, ForeignKey("CustomerRequest")]
    public int CustomerRequestId { get; set; }
    public virtual CustomerRequest CustomerRequest { get; set; }
}

public class LoanMap : EntityTypeConfiguration<Loan>
{
    public LoanMap()
    {
        HasRequired(m => m.CustomerRequest)
        .WithOptional(m => m.Loan)
        ;
    }
}

使用此配置,您可以具有1-0或1关系,但是您必须修改架构脚本。

您不能将Id作为主键,而将CustomerRequestId作为外键,EF不允许1-0或1关系。 从架构的角度来看,这也是一个错误的设计。

想象一下当您的CustomerRequest Id=1 然后,插入两个带有CustomerRequestId=1但具有不同Id主键的Loan条目。 您将如何以1-0或1关系查询EF模型中的两个Loan条目?

如果该模式是固定的,并且您不能对其进行修改,那么您必须采用“一对多”关系。

暂无
暂无

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

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