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应该持久化我的引用吗?
我通过关注这个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