1

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 を追加する前には発生しませんでした (これはあらゆる理由で必要です)。

4

2 に答える 2

0

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 規則に依存したくない場合は、DataAnnotationsまたはFluent APIを使用してリレーションシップを明示的に構成することも検討してください。

于 2012-09-25T00:56:03.920 に答える
0

そのため、エンティティ モデルとダイアグラムで少し作業した後、不要な 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);
于 2012-09-25T16:47:17.523 に答える