【问题标题】:Entity Object not refreshing after many to many .add and .saveChanges (System.NullReferenceException)在多对多 .add 和 .saveChanges (System.NullReferenceException) 之后实体对象不刷新
【发布时间】:2012-09-24 22:11:59
【问题描述】:

我有一个名为 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 上收到空引用异常错误,似乎在对象中找不到添加的新供应商。我已经研究过,我想出的只是 SaveChanges 应该修复它。在我添加 AssetReader 之前,这并没有发生,它存储了 Reader 的实际 SN(出于各种原因我需要它)。

【问题讨论】:

    标签: c# repository entity


    【解决方案1】:

    尝试将 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 Code First 约定,那么还可以考虑使用DataAnnotationsFluent API 来显式配置关系。

    【讨论】:

      【解决方案2】:

      因此,在使用实体模型和图表定义了一个我不需要的 id 并在 AssetValue 上创建了一个唯一约束并且没有映射和表更改以及各种墙壁之后,我最终得到了一个简单的解决方案.

                      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2022-01-05
        • 2012-09-01
        相关资源
        最近更新 更多