3

私のデータベースには、次の列を持つ「tracking」というテーブルがあります。

[OrderNumber] [varchar](50) NULL,
[TrackingNumber] [varchar](50) NULL,
[emailaddress] [varchar](100) NULL,
[courier] [varchar](10) NULL

テーブルのエンティティを表すTrackingというクラスがあります。

public class Tracking
{
    public virtual string OrderNumber { get; set; }
    public virtual string TrackingNumber { get; set; }
    public virtual string EmailAddress { get; set; }
    public virtual string Courier { get; set; }
}

私のデータコンテキストの定義では

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new TrackingConfig());
}

internal class TrackingConfig : EntityTypeConfiguration<Tracking>
{
    internal TrackingConfig()
    {
        Property(x => x.OrderNumber);
        Property(x => x.TrackingNumber);
        Property(a => a.EmailAddress).HasColumnName("emailaddress");
        Property(a => a.Courier).HasColumnName("courier");
    }
}

ご覧のとおり、私はそれを複合型として明示的にキャストしていません。大文字と小文字の違いが原因で列名を認識できない場合に備えて、HasColumnNameを使用して、どの列名がクラスのどのプロパティにマップされるかを指定しました。(私が得ているエラーは、HasColumnNameが使用されているかどうかに関係なく発生します。)

何らかの理由で設定したリポジトリを呼び出すと、初期化が失敗し、EntityFrameworkが例外をスローします。

The type 'Tracking' is mapped as a complex type. The Set method, DbSet objects, and DbEntityEntry objects can only be used with entity types, not complex types.

複雑なタイプとして設定していません...なぜEF4はそれを1つのように扱っているのですか?

4

1 に答える 1

1

フィールドを仮想として宣言することに関係しているようです。データ注釈を使用して、既存のdbスキーマと一致するようにテーブル名と列名をオーバーライドすることもできます。以下は、POCOモデルとdbcontextを設定する方法です。

[Table("tracking")]
public class Tracking
{
    public string OrderNumber { get; set; }
    public string TrackingNumber { get; set; }

    [Column(Name = "emailaddress")]
    public string EmailAddress { get; set; }

    [Column(Name = "courier")]
    public string Courier { get; set; }
}

public class TrackingEntities : DbContext
{
    public DbSet<Tracking> Trackings { get; set; }
}
于 2013-01-18T19:28:22.340 に答える