6.1.1插入关系

本文关键字:关系 插入 | 更新日期: 2023-09-27 18:11:14

我似乎找不到一个合适的解决方案,我的问题在SO或教程。

我有以下代码第一模式(无论如何是它的一部分)。

public partial class Csr
{
    public virtual CsrData CsrData { get; set; }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Id { get; set; }
}

public class CsrData
{
    [Key]
    public int Id { get; set; }
    public string CreatedBy { get; set; }
    public string CreatedOn { get; set; }
    public string CreatedAt { get; set; }
    [Required]
    public virtual Csr Csr { get; set; }
}

我还明确定义了关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);          
    modelBuilder.Entity<Csr>().HasOptional(csr => csr.CsrData).WithRequired();
}

两个id是相同的,我想保持Csr 1 <-> 0..1CsrData关系。我相信这部分至少是正确的。

现在,我正在从另一个源检索这些对象,并需要将其存储在数据库中。

当我尝试插入:

public void InsertCsr(Csr csr)
{
    var data = (EntityDataSource.DbContext as SmsData.SmsData);
    csr.CsrData.Csr = csr;
    data.Csrs.AddOrUpdate(csr);
    data.SaveChanges();
    EntityDataSource.Refresh();
}

CsrData没有被插入。Csr将被插入,并且模型更改将出现在CsrData表中。EF应该持久化插入吗?

或者,我试过这个:

public void InsertCsr(Csr csr)
{
    var data = (EntityDataSource.DbContext as SmsData.SmsData);
    csr.CsrData.Csr = csr;
    data.Csrs.AddOrUpdate(csr);
    data.CsrData.AddOrUpdate(csr.CsrData);
    data.SaveChanges();
    EntityDataSource.Refresh();
}

AddOrUpdate(csr.CsrData)从EntityFramework.dll抛出一个通用的NullRefException:

System.NullReferenceException occurred
_HResult=-2147467261
_message=Object reference not set to an instance of an object.
HResult=-2147467261
IsTransient=false
Message=Object reference not set to an instance of an object.
Source=EntityFramework
StackTrace:
   at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
编辑:

我已经弄清楚为什么CsrData不插入,因为SQL Server默认有4000个字符的字符串长度,我已经把它设置为最大现在和插入工作。

虽然作为我最初问题的一部分,我的完整模式是这样的Csr引用(0..1)CsrData条目,并有另一个对象的集合。

要插入Csr对象及其所有引用,我必须运行:

data.CsrData.AddOrUpdate(csr.CsrData);
data.CsrTransactions.AddOrUpdate(csr.Transactions.ToArray());
data.Csrs.AddOrUpdate(csr);
如果我AddOrUpdate只是一个Csr对象,EF应该持久化我的引用吗?

6.1.1插入关系

我通过关注这个MSDN帖子http://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToOptional也取得了类似的效果

在CsrData类中:更改Id为CsrId(它有助于识别意图)

在OnModelCreating函数中:更改modelBuilder定义为

// Configure the primary key for the CsrData 
  modelBuilder.Entity<CsrData>().HasKey(t => t.CsrId); 
// Map one-to-zero or one relationship 
  modelBuilder.Entity<CsrData>() 
      .HasRequired(t => t.Csr) 
      .WithOptional(t => t.CsrData);

另外,我通常称base.OnModelCreating(modelBuilder);为last