1

codefirst エンティティ フレームワークを使用して構築された 2 つのテーブルがあります。

public class TimeEntry:Entity
{
    [Required]
    [Display(Name = "Activity")]
    public int ActivityId { get; set; }

    public virtual Activity Activity { get; set; }  
}

public class Activity:Entity
{
    private ICollection<TimeEntry> _timeEntries;


    [Required]
    public string Description { get; set; }

    public virtual ICollection<TimeEntry> TimeEntries
    {
        get
        {
            return _timeEntries ?? (_timeEntries = new List<TimeEntry>());
        }
        set
        {
            _timeEntries = value;
        }
    }
}
public class Entity
{
    public int Id { get; set; }
}

これらは、私の Db 用に作成したクラスです。データベースの作成に問題はありません。CRUD 操作を実行しようとすると、エラーが発生します

DataBinding: 'System.Data.Entity.DynamicProxies.Activity_AD12BF558F098271F1F51B3B1489B4B3B281FD0B686C8457333DE5BEE0E8B6A9' には 'ActivityId' という名前のプロパティが含まれていません

Activity テーブルで ActivityId を見つけようとしていますが、主キーは Id です。TimeEntry テーブルの外部キー ActivityId を Activity テーブルの主キー Id にマップするにはどうすればよいですか。

4

3 に答える 3

3

流暢な API を使用して、マッピングについて EF に知らせることができます。

public class ActivityMap : EntityTypeConfiguration<Activity>
{
    public ActivityMap()
    {
         this.HasKey(a => a.Id);
    }
}

public class TimeEntryMap : EntityTypeConfiguration<TimeEntry>
{
    public TimeEntryMap()
    {
        this.HasKey(t => t.Id);
        // Relationships
        this.HasRequired(t => t.Activity)
            .WithMany(t => t.TimeEntries)
    }            .HasForeignKey(d => d.ActivityId);
}  

次に、コンテキストで:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ActivityMap());
        modelBuilder.Configurations.Add(new TimeEntryMap());
    }
}  

これで問題が解決すると思います。

また、(補足として) を定義する代わりに、_timeEntries自動実装プロパティを使用TimeEntriesして ctor で初期化することができます。以下のように:

public class Activity:Entity
{
    public virtual ICollection<TimeEntry> TimeEntries { get; set; }
    public Activity()
    {
        this.TimeEntries = new List<TimeEntry>();
    }
}
于 2012-08-14T15:25:32.163 に答える
0

Code First を使用している場合は、DbContext で OnModelCreating をオーバーライドして、ActivityId => Id のマッピングを示す必要があります。

提案では、DTO と MVC ViewModel の懸念を同じエンティティに混在させているようです。これらの懸念を 2 つの異なるエンティティに分けてみませんか?

于 2012-08-14T15:28:51.037 に答える