实体框架6.1.1插入关系

时间:2014-07-02 18:24:47

标签: c# entity-framework entity-relationship

我似乎无法在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&lt; - &gt; 0..1 CsrData关系。我相信这部分至少是正确的。

现在,我从其他来源检索这些对象,并需要将其存储在Db中。

当我尝试插入时:

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个字符,我现在将其设置为max并且插入正在工作。

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

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

data.CsrData.AddOrUpdate(csr.CsrData);
data.CsrTransactions.AddOrUpdate(csr.Transactions.ToArray());
data.Csrs.AddOrUpdate(csr);

如果AddOrUpdate只是一个Csr对象,EF是否应该保留我的引用?

1 个答案:

答案 0 :(得分:0)

我已经通过此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);