C# 多对多.add和.saveChanges后未刷新实体对象(System.NullReferenceException)
我有一个名为VendorReader的多对多实体,它看起来是这样的:C# 多对多.add和.saveChanges后未刷新实体对象(System.NullReferenceException),c#,repository,entity,C#,Repository,Entity,我有一个名为VendorReader的多对多实体,它看起来是这样的: public partial class VendorReader { public int ID { get; set; } public int VendorID { get; set; } public string AssetValue { get; set; } public virtual Vendor Vendor { get; set; } public virtual
public partial class VendorReader
{
public int ID { get; set; }
public int VendorID { get; set; }
public string AssetValue { get; set; }
public virtual Vendor Vendor { get; set; }
public virtual AssetReader AssetReader { get; set; }
}
public class VendorReaderRepository : Repository<VendorReader>
{
public VendorReaderRepository() { }
public VendorReaderRepository(EventBadgesEntities ctx) : base(ctx) { }
public List<VendorReader> GetVendorReadersByEventID(int eventID)
{
return ctx.VendorReaders
.Where(e => e.Vendor.EventID == eventID)
.ToList();
}
public int GetVendorIDByReaderSN(string readerSN) {
VendorReader thisList = ctx.VendorReaders
.Where(e => e.AssetReader.ReaderSN == readerSN)
.SingleOrDefault();
return thisList.VendorID;
}
}
我有一个VendorReader的存储库,看起来是这样的:
public partial class VendorReader
{
public int ID { get; set; }
public int VendorID { get; set; }
public string AssetValue { get; set; }
public virtual Vendor Vendor { get; set; }
public virtual AssetReader AssetReader { get; set; }
}
public class VendorReaderRepository : Repository<VendorReader>
{
public VendorReaderRepository() { }
public VendorReaderRepository(EventBadgesEntities ctx) : base(ctx) { }
public List<VendorReader> GetVendorReadersByEventID(int eventID)
{
return ctx.VendorReaders
.Where(e => e.Vendor.EventID == eventID)
.ToList();
}
public int GetVendorIDByReaderSN(string readerSN) {
VendorReader thisList = ctx.VendorReaders
.Where(e => e.AssetReader.ReaderSN == readerSN)
.SingleOrDefault();
return thisList.VendorID;
}
}
在基本存储库中执行此操作的是:
public T Add(T entity)
{
ctx.Set<T>().Add(entity);
ctx.SaveChanges();
return entity;
}
这是什么意思
public MapVendorModel(int eventID)
{
// steps to create a selectlist
VendorRepository vr = new VendorRepository();
listVendor = vr.GetVendorsByEventID(eventID)
.ToList()
.OrderBy(x => x.VendorName)
.ToSelectList(x => x.VendorName, x => x.ID.ToString(), null)
.ToList();
EventID = eventID;
// now let's get the vendor reader list
VendorReaderRepository mvmVrr = new VendorReaderRepository();
VendorReaderList = mvmVrr.GetVendorReadersByEventID(eventID)
.ToList()
.OrderBy(x => x.Vendor.VendorName)
.ToList();
}
但当我这样做时,我在x.Vendor.VendorName b/c上得到一个空引用异常错误,似乎在对象中找不到添加的新供应商。我已经研究过了,我想到的是SaveChanges应该可以解决这个问题。这在我添加AssetReader之前没有发生过,它存储我出于各种原因需要的读卡器的实际序列号。尝试将AssetReaderID属性添加到VendorReader类中以与导航属性一起使用
public partial class VendorReader
{
public int ID { get; set; }
public string AssetValue { get; set; }
public int VendorID { get; set; }
public virtual Vendor Vendor { get; set; }
public int AssetReaderID { get; set; }
public virtual AssetReader AssetReader { get; set; }
}
如果您不想依赖默认的EF代码第一约定,那么也可以考虑使用或替代地显式配置关系。< /P> < P>这样,在使用实体模型和定义了我不需要的ID的图表之后,创建了对AsStEdValk的唯一约束,而不是映射和表。改变和各种各样的墙,我最终得到了一个简单的解决方案
thisVendorReader.vendorID = model.AddEditVendorReader.vendorID;
thisVendorReader.AssetValue = model.AddEditVendorReader.AssetValue;
// need to add vendor too (even though we add the vendorID
// b/c entity doesn't automatically give you the vendor in a single call)
vendor newVendor = new vendor();
vendorRepository vRepo = new vendorRepository();
newVendor = vRepo.GetById(thisVendorReader.vendorID);
thisVendorReader.vendor = newVendor;
vrr.Add(thisVendorReader);