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; }
}
次のような VendorReader のリポジトリがあります。
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;
}
}
私のコードでは、これを行います:
thisVendorReader.VendorID = model.AddEditVendorReader.VendorID;
thisVendorReader.AssetValue = model.AddEditVendorReader.AssetValue;
vrr.Add(thisVendorReader);
ベースリポジトリでこれを行うのは次のとおりです。
public T Add(T entity)
{
ctx.Set<T>().Add(entity);
ctx.SaveChanges();
return entity;
}
それから私はこれをやろうとします:
model = new MapVendorModel(model.EventID);
これは次のことを行います:
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 で Null Reference Exception エラーが発生し、追加された新しいベンダーがオブジェクトに見つからないようです。私は調査しましたが、思いついたのは、SaveChanges がそれを修正するはずだということだけです。これは、リーダーの実際の SN を格納する AssetReader を追加する前には発生しませんでした (これはあらゆる理由で必要です)。