1

EF5コードを使用する最初の流暢なAPIオブジェクトをロードするときに、「無効な列名Doctor_ID」というエラーが表示されます。

public class User
{
    public int ID { get; set; }
    ...
}

public class Doctor : User
{

    public int? TitleID { get; set; }
    public virtual Title Title { get; set; }
}


public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        this.ToTable("User", "Users");

        // Primary Key
        this.HasKey(t => t.ID);

        ...

    }
}

public class DoctorMap : EntityTypeConfiguration<Doctor>
{
    public DoctorMap()
    {
        // Table & Column Mappings            
        this.ToTable("Doctor", "Doctors");

        //this.Property(t => t.ID).HasColumnName("ID");
        this.Property(t => t.TitleID).HasColumnName("TitleID");            

        // Relationships
        this.HasOptional(t => t.Title)
            .WithMany(t => t.Doctors)
            .HasForeignKey(d => d.TitleID);

    }
}    

コードは以下を正常に実行します。

return (from item in this.DataProvider.Users
                    where
                        item.Username == username && item.Password == password
                    select new UserBasicInfo() { ID = item.ID, FirstName = item.FirstName, LastName = item.FirstName, Username = item.Username }).FirstOrDefault();

このコードの後に​​以下を実行すると、「無効な列名Doctor_ID」例外が発生します。

User user = this.DataProvider.Users.SingleOrDefault(item => item.ID == id);

コードの最初の行はusersテーブルからのみデータを取得するため、正常に実行されますが、2番目のEF5では、アクセス時にDoctorテーブルのキーとしてIDを使用できないのはなぜですか。

注:タイプごとにタイプTPTを使用しています。

4

1 に答える 1

2

上記のコードに問題があるとは思いません。エラーを再現できませんでした。CodeFirstはどのテーブルにもDoctor_ID列を生成しませんでした。ここにマッピングされていない他の関係はありますか?

コンソールアプリ全体は次のとおりです。

public class User
{
    public int ID { get; set; }
}

public class Doctor : User
{
    public int? TitleID { get; set; }
    public virtual Title Title { get; set; }
}
public class Title
{
    public int TitleId { get; set; }
    public ICollection<Doctor> Doctors { get; set; }
}

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        this.ToTable("User", "Users");

        // Primary Key
        this.HasKey(t => t.ID);
    }
}

public class DoctorMap : EntityTypeConfiguration<Doctor>
{
    public DoctorMap()
    {
        // Table & Column Mappings            
        this.ToTable("Doctor", "Doctors");

        //this.Property(t => t.ID).HasColumnName("ID");
        this.Property(t => t.TitleID).HasColumnName("TitleID");

        // Relationships
        this.HasOptional(t => t.Title)
            .WithMany(t => t.Doctors)
            .HasForeignKey(d => d.TitleID);

    }
}
public class Model : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Doctor> Doctors { get; set; }
    public DbSet<Title> Titles { get; set; }

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

class Program
{
    public static void Main()
    {
        Model m = new Model();
        //var doctor = new Doctor();
        //m.Doctors.Add(doctor);
        //m.SaveChanges();
        var user = m.Users.SingleOrDefault(item => item.ID == 1);

        Console.WriteLine(user.ID);
        Console.ReadLine();
    }

}

このデータベースを作成したのは:

ここに画像の説明を入力してください

于 2012-10-16T18:29:49.183 に答える