「コードファースト」の方法論を理解するためだけに、非常に小さなプロジェクトがあります。
'code first'を使用してデータベースを作成し、オブジェクトを追加すると、正常に機能し、オブジェクトのすべてのプロパティがデータベースに保存されます。次に、保存されたオブジェクトを取得しようとします。オブジェクトを返しますが、1つのプロパティは常にnullです。
誰かが私のコードの何が問題になっているのか説明できますか?
エンティティクラス
public class Item
{
public Guid Id { get; set; }
public string OwnerId { get; set; }
public DateTime CreationDate { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsStoreItem { get; set; }
public decimal Price { get; set; }
public int Count { get; set; }
public string TopBidderId { get; set; }
public Material Material { get; set; }
public ItemStatus Status { get; set; }
public int KrauseNumber { get; set; }
}
データベースエンティティ
public class ApplicationDbContext : IdentityDbContext<ApplicationIdentityUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false) { }
public DbSet<Item> Items { get; set; }
public static ApplicationDbContext Create() => new ApplicationDbContext();
}
}
ジェネリックレポ
public class EfGenericRepository<T> : IEfGenericRepository<T> where T : class
{
internal readonly ApplicationDbContext _dbContext;
internal readonly DbSet<T> _dbSet;
public EfGenericRepository(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
_dbSet = _dbContext.Set<T>();
}
public virtual IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "")
{
IQueryable<T> query = _dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
}
エンティティを取得してみてください
public void GetEntity(Guid id)
{
var context = new Repository();
var auction = context.ItemRepository.Get().FirstOrDefault(i => i.Id == id);
}
結果は
更新
また、私は言わなければなりません、それ
var request = "SELECT TopBidderId FROM Items WHERE Id = '*item_id*'";
var result = _dbContext.Database.SqlQuery<string>(request).FirstOrDefaultAsync().Result;
うまく機能し、絶対に正しい値を返します。
モデルについては、MaterialとItemStatusは列挙型だと思います。それ以外の場合は、プロパティを仮想としてマークすることをお勧めします(遅延読み込みの場合)。
また、リポジトリの実装についてもよくわかりません。各EfGenericRepositoryには独自のコンテキストがあり、それが優れた設計であるかどうかはわかりませんが、質問の対象ではありません。
答え:
モデルにはTopBidderIdという名前の文字列プロパティが含まれています。データベースを作成するとき、フィールドタイプは「text」(最近のSQL Serverのvarchar(max)、MySQL、CLOBなどのテキスト)に似ています。そのため、その中に文字列を書くことができます。あなたの場合、それはGUIDのToStringのようです。コンテンツを読み取ると、文字列がTopBidderIdプロパティに挿入されます。
これが起こらない方法はありません。テキスト(またはvarchar(max))列をモデルのTopBidderIdの文字列に変換できます。
ちなみに、私はあなたのコードを実行しようとしました(IdentityDbContextからではなくコンテキストから開始し、2つの欠落している列挙型とリポジトリクラスを追加します、デフォルトの移行)、それは期待どおりに機能します。
では、なぜあなたの場合はうまくいかないのですか?データベースモデルがエンティティモデルに対応していないと思います(TopBidderId列はテキストでもvarchar maxでもありません)。通常は発生しませんが、発生する場合があります。たとえば、モデルチェック(エンティティモデルと__MigrationHistoryテーブルのコンテンツの間のチェック)を無効にした場合、またはデータベースの移行後にTopBidderId列タイプを変更した場合です。
もう1つのケースは、エンティティモデルがここに投稿したものと異なる場合です(TopBidderIdは、タイプBidderのプロパティTopBidderによって使用される外部キーです)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加