118

これを Code First と Database first EF の間の問題に絞り込みましたが、修正方法がわかりません。できる限り明確にしようとしますが、正直なところ、ここでの理解の一部が欠けています。これは Entity Framework 4.4 です

Entity Framework が使用されているプロジェクトを継承しましたが、実際のファイルの多くが削除され、実際に戻る方法がありません。EF (データベースを最初に) を再度追加し、プロジェクトが構築された T4 セットアップを複製しました。すべてのデータベース モデルのコード バージョンと DBContext コード ファイルを生成しました。

接続文字列が「通常の」.NET 接続文字列のように見える場合、無効な列 Name "ProcessState_ID" does not exist に関するエラーが表示されます。ProcessState_ID はコード ベースにはまったく含まれておらず、EDMX ファイルなどにも含まれていません。これは、クエリでの自動 EF 変換のようです。

接続文字列を Entity Framework モデルと一致させると、正常に動作します。

ここで、前のコードを Entity Framework と一致させようとして、「通常の」.NET 接続文字列を維持したいと考えています。

そこで、ここで 2 つの質問があります。1. コードで通常の接続文字列から EF 接続文字列に移行するための適切な方法は何ですか? 2. 無効な列名エラーを停止するために表示されていない別の修正方法はありますか?

4

19 に答える 19

114

ICollection があるかどうかを確認します。

私が理解したのは、テーブルを参照する ICollection があり、それが把握できる列がない場合、テーブル間の接続を試みるための列が作成されるということです。これは特に ICollection で発生し、それを理解しようとして「バティ」になりました。

于 2013-12-18T08:23:05.403 に答える
45

私はついにこれを理解しました。

私は最初にEF6データベースを実行していますが、「範囲不明の列」エラーについて疑問に思っていました-何らかの理由でテーブル名アンダースコア列名を生成し、存在しない列を見つけようとしていました.

私の場合、テーブルの 1 つに、別のテーブルの同じ主キーへの 2 つの外部キー参照がありました。次のようなものです。

Animals            Owners
=======            ======
AnimalID (PK)      Pet1ID    <- FK to AnimalID
                   Pet2ID    <- also FK to AnimalID

Owners_AnimalID1EF は、 andのような奇妙な列名を生成していOwners_AnimalID2た後、それ自体を壊しました。

ここでの秘訣は、Fluent API を使用して、これらの紛らわしい外部キーを EF に登録する必要があることです!

メイン データベース コンテキストで、メソッドをオーバーライドしOnModelCreating、エンティティ構成を変更します。できれば、クラスを拡張する別のファイルを用意しますが、EntityConfigurationインラインで行うこともできます。

いずれにせよ、次のようなものを追加する必要があります。

public class OwnerConfiguration : EntityTypeConfiguration<Owner>
{
    public OwnerConfiguration()
    {
        HasRequired(x => x.Animals)
            .WithMany(x => x.Owners)  // Or, just .WithMany()
            .HasForeignKey(x => x.Pet1ID);
    }
}

これで、EF は (おそらく) 期待どおりに動作し始めます。ブーム。

また、null 許容列で上記を使用すると、同じエラーが発生し.HasOptional()ます.HasRequired()


これが私をこぶに乗せたリンクです:

https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx

次に、Fluent API ドキュメント、特に外部キーの例が役に立ちます。

http://msdn.microsoft.com/en-us/data/jj591620.aspx

ここで説明するように、キーの反対側に構成を配置することもできます。

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx .

私が今直面しているいくつかの新しい問題がありますが、それは欠けていた巨大な概念のギャップでした. それが役に立てば幸い!

于 2015-01-17T16:38:22.920 に答える
3

私の場合、次のように 2 つの外部キーで構成される主キーを誤って定義していました。

HasKey(x => x.FooId);
HasKey(x => x.BarId);

HasRequired(x => x.Foo)
    .WithMany(y => y.Foos);
HasRequired(x => x.Bar);

私が得ていたエラーは、「無効な列名Bar_ID」でした。

複合主キーを正しく指定すると、問題が修正されました。

HasKey(x => new { x.FooId, x.BarId });

...
于 2017-08-02T18:42:46.133 に答える
2

私もこの問題を抱えていましたが、いくつかの異なる原因があるようです。私にとっては、ナビゲーション オブジェクトを含む親クラスで、id プロパティが long ではなく int として誤って定義されていました。データベースの id フィールドは、C# の long に対応する bigint として定義されていました。これにより、コンパイル時エラーは発生しませんでしたが、OP が取得したのと同じ実行時エラーが発生しました。

// Domain model parent object
public class WidgetConfig 
{
    public WidgetConfig(long id, int stateId, long? widgetId)
    {
        Id = id;
        StateId = stateId;
        WidgetId = widgetId;
    }

    private WidgetConfig()
    {
    }

    public long Id { get; set; }

    public int StateId { get; set; }

    // Ensure this type is correct
    public long? WidgetId { get; set; } 

    public virtual Widget Widget { get; set; }
}

// Domain model object
public class Widget
{
    public Widget(long id, string name, string description)
    {
        Id = id;
        Name = name;
        Description = description;
    }

    private Widget()
    {
    }

    public long Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }
}

// EF mapping
public class WidgetConfigMap : EntityTypeConfiguration<WidgetConfig>
{
    public WidgetConfigMap()
    {
        HasKey(x => x.Id);
        ToTable(nameof(WidgetConfig));
        Property(x => x.Id).HasColumnName(nameof(WidgetConfig.Id)).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
        Property(x => x.StateId).HasColumnName(nameof(WidgetConfig.StateId));
        Property(x => x.WidgetId).HasColumnName(nameof(WidgetConfig.WidgetId));
    }
}   

// Service
public class WidgetsService : ServiceBase, IWidgetsService
{
    private IWidgetsRepository _repository;

    public WidgetsService(IWidgetsRepository repository)
    {
        _repository = repository;
    }

    public List<WidgetConfig> ListWithDetails()
    {
        var list = _repository.ListWithDetails();

        return new WidgetConfigMapping().ConvertModelListToDtoList(list).ToList();
    }
}   

// Repository
public class WidgetsRepository: BaseRepository<WidgetConfig, long>, IWidgetsRepository
{
    public WidgetsRepository(Context context)
        : base(context, id => widget => widget.Id == id)
    {
    }

    public IEnumerable<WidgetConfig> ListWithDetails()
    {
        var widgets = Query
            .Include(x => x.State)
            .Include(x => x.Widget);

        return widgets;
    }
}
于 2016-03-22T11:59:50.157 に答える
2

私にとっての問題は、アプリでテーブルを 2 回マップしたことです。1 回は Code First 経由、1 回は Database First 経由です。

私の場合、どちらかを削除すると問題が解決します。

于 2017-03-14T18:31:50.680 に答える
0

ナビゲーション プロパティを virtual にするのを忘れていました

public Guid GroupId { get; set; }
public Group Group { get; set; }

->

public Guid GroupId { get; set; }
public virtual Group Group { get; set; }
于 2021-11-12T08:03:14.653 に答える
0

私の問題は、テーブルのカスタムトリガーに関係していました

于 2021-02-28T00:07:08.573 に答える