2

私は、MVC3、Razor、およびEntity Framework 4.1を使用して、リポジトリパターンでスキーマファーストアプローチ(コードファーストアプローチとは対照的に)を使用してテストアプリケーションを構築しています。ビュー内のデータオブジェクトにアクセスせず、代わりにモデルにアクセスしたいのですが、問題が発生しています。私の知る限り、データオブジェクトはデータレイヤーからObjectSetとして返されますが、ビューにはIEnumerableが必要であり、一方を他方にキャストする方法がわかりません。

明確にするために、ここにいくつかのコードがあります。


モデル ...

namespace TestSolution.Models
{
    public class ProjectModel
    {
        [HiddenInput]
        public int Id { get; set; }

        [Required]
        [StringLength(255, ErrorMessage = "The name cannot be more than 255 characters long.")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Required]
        [Display(Name = "Description")]
        public string Description { get; set; }
    }
}

リポジトリ..。

public IQueryable<ProjectModel> GetProjects()
{
    return Db.Project;
}

エンティティ..。

public ObjectSet<Project> Project
{
    get
    {
        if ((_Project == null))
        {
            _Project = base.CreateObjectSet<Project>("Project");
        }
        return _Project;
    }
}

コントローラー..。

public ActionResult Index()
{
    IEnumerable<TestSolution.Models.ProjectModel> model = _projectRepository.GetProjects();
    return View(model);
}

意見 ...

@model IEnumerable<TestSolution.Models.ProjectModel>

ビルド時に発生するエラー...

Cannot implicitly convert type 'System.Data.Objects.ObjectSet<TestSolution.Project>' to 'System.Linq.IQueryable<TestSolution.Models.ProjectModel>'. An explicit conversion exists (are you missing a cast?)

この質問は理にかなっていますか?ここからどこへ行くのかよくわかりません...皆さんが私に教えてくれるアドバイスは素晴らしいでしょう。:)

編集:リポジトリコードを...に変更することで、カイルの提案でこれを解決することができました...

public IQueryable<ProjectModel> GetProjects()
{
  return Db.Project.Select(i => new ProjectModel() { Id = i.Id, Name = i.Name, Description = i.Description });
}
4

1 に答える 1

1

ObjectSet<T>問題はからへの変換ではありませんIEnumerable<T>ObjectSet<T>実装IEnumerable<T>)。

TestSolution.Project問題はからへの変換TestSolution.Models.ProjectModelです。変換コードを書く必要があります。おそらく以下のようなものです。

model.Select(i => new ProjectModel() { /* Set properties here. */ });
于 2012-06-30T00:01:18.870 に答える