我似乎无法在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是否应该保留我的引用?
答案 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);