0

質問があります。

私はこれらの2つのテーブルを持っています: テーブル

プリンシパル テーブルは、Customer 依存関係を持つ User です。

リバース エンジニア コードは、最初に次のようにクラスを生成しました。

public class User
{
    public User()
    {
        this.Customers = new List<Customer>();          
    }

    ...

    public virtual ICollection<Customer> Customers { get; set; }

}

public class Customer
{
    public Customer()
    {
    }

    ...

    public int UserID { get; set; }
    public virtual User User { get; set; }

}

ユーザークラスで次の変更を行いました。

public class User
{
    public User()
    {          

    }
    public int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }

}

関係は 1 対 0 または 1 であるためです。

元のマッピングは次のとおりです。

// Relationships
        this.HasRequired(t => t.User)
            .WithMany(t => t.Customers)
            .HasForeignKey(d => d.UserID);

変更されたマッピングは次のとおりです。

this.HasRequired(t => t.User)
            .WithOptional(t => t.Customer)
            .Map(m => m.MapKey("UserID"));

あれは正しいですか?そうでない場合、このマッピングはどのようになりますか?

ありがとう。

4

1 に答える 1

2

いいえ、それは正しくありません。

あなたができる最善のことは、データベーススキーマを変更できると仮定UserIDして、テーブルから外部キーを削除Customerし、データベースで2つの主キー間の関係を作成して、それCustomer.CustomerIDが関連付けの外部キーになるようにすることです。

リバース エンジニアリングは、次のように、予想される 1 対 1 の関係を自動的に作成する必要があります。

public class Customer
{
    public int CustomerID { get; set; }
    public virtual User User { get; set; }
    //...
}

public class User
{
    public int UserID { get; set; }
    public virtual Customer Customer { get; set; }
    //...
}

//...

this.HasRequired(t => t.User)
    .WithOptional(t => t.Customer);

データベース スキーマを変更できない場合、最善の策はICollection<Customer> Customers、クラスからコレクションを削除するだけUserで、関係を 1 対多のままにすることです。

これはすべて、EF が共有主キーの 1 対 1 の関連付けのみをサポートし、外部キーの 1 対 1 の関連付けをサポートしていないためです。(後者は、コレクションを削除することによってのみ「偽造」できますが、EF の観点からは依然として 1 対多です。)

EF との 1 対 1 の関連付けとその制限について詳しくは、次を参照してください。

于 2012-11-03T19:27:15.010 に答える