簡體   English   中英

實體框架核心 - 無法添加子記錄

[英]Entity Framework Core - Can't Add Child records

我有父子關系,我無法在 EF Core 中使用腳手架命令,因為子表沒有鍵。 我不允許添加密鑰,所以我堅持使用架構。

當我保存更改時,我得到以下內部異常: Invalid column name 'NewBusinessMasterNbTransactionId'

Startup.cs 中的代碼:

  public void ConfigureServices(IServiceCollection services)
  {
    var connection = Configuration.GetSection("SqlConnection1").Value;
    services.AddScoped<IDharma, DharmaRepo>();
    services.AddDbContext<DharmaContext>(options => options.UseSqlServer(connection));
  }

DharmaContext 中的代碼(我刪除了大部分數據列以使其更短):

 public partial class DharmaContext : DbContext
 {
    public DharmaContext()
    {
    }

    public DharmaContext(DbContextOptions<DharmaContext> options)
        : base(options)
    {
    }

    public virtual DbSet<NewBusinessMaster> NewBusinessMaster { get; set; }
    public virtual DbSet<NewBusinessDetail> NewBusinessDetail { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasAnnotation("ProductVersion", "2.2.4-servicing-10062");
        modelBuilder.Entity<NewBusinessMaster>(entity =>
        {
            entity.HasKey(e => e.NbTransactionId);

            entity.ToTable("NewBusiness_Master");

            entity.Property(e => e.NbTransactionId).HasColumnName("NB_TRANSACTION_ID");

            entity.Property(e => e.NbLob)
                .HasColumnName("NB_LOB")
                .HasMaxLength(2)
                .IsUnicode(false);

        });

        modelBuilder.Entity<NewBusinessDetail>(entity =>
        {
            entity.HasKey(e => e.NbTransactionId);

            entity.ToTable("NewBusiness_Detail");

            entity.Property(e => e.NbTransactionId).HasColumnName("NB_TRANSACTION_ID");
        });
            entity.Property(e => e.NbAgentNumber)
                .IsRequired()
                .HasColumnName("NB_AGENT_NUMBER")
                .HasMaxLength(9)
                .IsUnicode(false);
     }
  }

模型(我刪除了大部分數據以使其更易於閱讀):

    public partial class NewBusinessMaster
    {
        public int NbTransactionId { get; set; }
        public string NbLob { get; set; }

        public List<NewBusinessDetail> NewBusinessDetail { get; set; }

        public NewBusinessMaster()
        {
            NewBusinessDetail = new List<NewBusinessDetail>();
        }

    }

    public partial class NewBusinessDetail
    {
        public int NbTransactionId { get; set; }
        public string NbAgentNumber { get; set; }
    }
}

添加和保存記錄的代碼:

NewBusinessMaster nbMaster = new NewBusinessMaster();
nbMaster.NbLob = "AU";
NewBusinessDetail nbDetailItem = new NewBusinessDetail();
foreach (XElement item in screenH202.Descendants())
{
    nbDetailItem = new NewBusinessDetail();
    if (!string.IsNullOrEmpty(item.Value))
    {
        nbDetailItem.NbAgentNumber = nbMaster.NbAgentNumber;
    }
}
_context.NewBusinessMaster.Add(nbMaster);
 try
 {
    await _context.SaveChangesAsync(); //this line throws the error
 }
 catch (DbUpdateException dbEx)
 {
    throw;
 }

SQL截圖:

在此處輸入圖像描述

在此處輸入圖像描述

根據定義,“實體”是帶有標識符的 object。 它被稱為實體框架是有原因的,它是一個用於處理實體的框架,這意味着它們必須具有主鍵(標識符)。

也就是說,這里可能有幾個選項供您選擇。 首先,EF Core 支持它所謂的“自有實體”。 這些本質上是值對象(一個 object 從其值的總和而不是顯式標識符(例如地址)中獲取其身份),因此沒有顯式標識符屬性。 但是,它們仍然有一個主鍵,也就是外鍵,與“擁有”它們的實體建立了一對一的關系。 不過,我不確定您將如何實際構建自有類型。 如果您有一個表,其中外鍵也是主鍵,EF Core 可能會推斷它是一個擁有的類型,但如果還不是這種情況,則可能仍需要向表中添加主鍵。

唯一的其他選項是 EF Core 所指的查詢類型或無鍵實體類型(名稱在 3.0 中已更改為無鍵)。 這些實際上是沒有主鍵的表或視圖,或者只是來自 function 或存儲過程之類的結果,與您的場景非常匹配。 但是,它們只能讀取,不能插入或修改,這可能不適用於您的方案。 我也不確定如何使用腳手架進行管理。 無鍵類型更多是您手動添加到上下文中的東西,而不是 EF Core 會為您生成的東西。

我終於被允許向子表添加一個鍵。 這使代碼變得簡單,我可以使用腳手架命令。

課程:

public partial class NewBusinessMaster
{
    public NewBusinessMaster()
    {
        NewBusinessDetail = new HashSet<NewBusinessDetail>();
    }

    public int NbTransactionId { get; set; }
    public string NbLob { get; set; }
    public string NbReferenceNumber { get; set; }
    public string NbAgentNumber { get; set; }
    public string NbEntryOper { get; set; }
    public string NbEffectiveDate { get; set; }
    public string NbInsName { get; set; }
    public string NbInsNameAddr { get; set; }
    public string NbInsAddr { get; set; }
    public string NbInsCity { get; set; }
    public string NbInsState { get; set; }
    public string NbInsZip { get; set; }
    public string NbInsPhone { get; set; }
    public string NbUploadInd { get; set; }
    public DateTime NbCreateDate { get; set; }
    public string NbLockedBy { get; set; }
    public string NbQuoteId { get; set; }

    public virtual ICollection<NewBusinessDetail> NewBusinessDetail { get; set; }
}


public partial class NewBusinessDetail
{
    public int NewBusinessDetailId { get; set; }
    public int NbTransactionId { get; set; }
    public string NbAgentNumber { get; set; }
    public string NbScreenName { get; set; }
    public string NbFieldName { get; set; }
    public string NbFieldValue { get; set; }
    public DateTime? NbLastUpdated { get; set; }

    public virtual NewBusinessMaster NbTransaction { get; set; }
}

//Context
public partial class DharmaContext : DbContext
{
    public DharmaContext()
    {
    }

    public DharmaContext(DbContextOptions<DharmaContext> options)
        : base(options)
    {
    }

    public virtual DbSet<NewBusinessDetail> NewBusinessDetail { get; set; }
    public virtual DbSet<NewBusinessMaster> NewBusinessMaster { get; set; }


    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasAnnotation("ProductVersion", "2.2.4-servicing-10062");

        modelBuilder.Entity<NewBusinessDetail>(entity =>
        {
            entity.Property(e => e.NewBusinessDetailId).HasColumnName("NewBusinessDetail_ID");

            entity.Property(e => e.NbAgentNumber)
                .IsRequired()
                .HasColumnName("NB_AGENT_NUMBER")
                .HasMaxLength(9)
                .IsUnicode(false);

            entity.Property(e => e.NbFieldName)
                .HasColumnName("NB_FIELD_NAME")
                .HasMaxLength(8)
                .IsUnicode(false);

            entity.Property(e => e.NbFieldValue)
                .HasColumnName("NB_FIELD_VALUE")
                .HasMaxLength(1000)
                .IsUnicode(false);

            entity.Property(e => e.NbLastUpdated)
                .HasColumnName("NB_LAST_UPDATED")
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.NbScreenName)
                .HasColumnName("NB_SCREEN_NAME")
                .HasMaxLength(4)
                .IsUnicode(false);

            entity.Property(e => e.NbTransactionId).HasColumnName("NB_TRANSACTION_ID");

            entity.HasOne(d => d.NbTransaction)
                .WithMany(p => p.NewBusinessDetail)
                .HasForeignKey(d => d.NbTransactionId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("MasterDetail_FK");
        });

        modelBuilder.Entity<NewBusinessMaster>(entity =>
        {
            entity.HasKey(e => e.NbTransactionId);

            entity.Property(e => e.NbTransactionId).HasColumnName("NB_TRANSACTION_ID");

            entity.Property(e => e.NbAgentNumber)
                .IsRequired()
                .HasColumnName("NB_AGENT_NUMBER")
                .HasMaxLength(9)
                .IsUnicode(false);

            entity.Property(e => e.NbCreateDate)
                .HasColumnName("NB_CREATE_DATE")
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.NbEffectiveDate)
                .HasColumnName("NB_EFFECTIVE_DATE")
                .HasMaxLength(6)
                .IsUnicode(false);

            entity.Property(e => e.NbEntryOper)
                .IsRequired()
                .HasColumnName("NB_ENTRY_OPER")
                .HasMaxLength(3)
                .IsUnicode(false);

            entity.Property(e => e.NbInsAddr)
                .HasColumnName("NB_INS_ADDR")
                .HasMaxLength(30)
                .IsUnicode(false);

            entity.Property(e => e.NbInsCity)
                .HasColumnName("NB_INS_CITY")
                .HasMaxLength(30)
                .IsUnicode(false);

            entity.Property(e => e.NbInsName)
                .HasColumnName("NB_INS_NAME")
                .HasMaxLength(30)
                .IsUnicode(false);

            entity.Property(e => e.NbInsNameAddr)
                .HasColumnName("NB_INS_NAME_ADDR")
                .HasMaxLength(30)
                .IsUnicode(false);

            entity.Property(e => e.NbInsPhone)
                .HasColumnName("NB_INS_PHONE")
                .HasMaxLength(12)
                .IsUnicode(false);

            entity.Property(e => e.NbInsState)
                .HasColumnName("NB_INS_STATE")
                .HasMaxLength(2)
                .IsUnicode(false);

            entity.Property(e => e.NbInsZip)
                .HasColumnName("NB_INS_ZIP")
                .HasMaxLength(11)
                .IsUnicode(false);

            entity.Property(e => e.NbLob)
                .HasColumnName("NB_LOB")
                .HasMaxLength(2)
                .IsUnicode(false);

            entity.Property(e => e.NbLockedBy)
                .HasColumnName("NB_LOCKED_BY")
                .HasMaxLength(3)
                .IsUnicode(false);

            entity.Property(e => e.NbQuoteId)
                .HasColumnName("NB_QUOTE_ID")
                .HasMaxLength(15)
                .IsUnicode(false);

            entity.Property(e => e.NbReferenceNumber)
                .IsRequired()
                .HasColumnName("NB_REFERENCE_NUMBER")
                .HasMaxLength(9)
                .IsUnicode(false);

            entity.Property(e => e.NbUploadInd)
                .HasColumnName("NB_UPLOAD_IND")
                .HasMaxLength(1)
                .IsUnicode(false);
        });
    }


//Code to add parent and child
NewBusinessMaster nbMaster = new NewBusinessMaster();
//set each property of master
//...

nbDetailItem = new NewBusinessDetail();
nbMaster.NewBusinessDetail.Add(nbDetailItem);
_context.NewBusinessMaster.Add(nbMaster);
 try
        {
            await _context.SaveChangesAsync();

        }
        catch (DbUpdateException dbEx)
        {

            throw;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM