1

EF v4 の関係に問題があります。この質問が非常に人気があることは知っています。インターネットで何かを見つけようとしましたが、役に立ちませんでした。Addressと1対1のPersonクラスがあります(Person has Address)

class Person
{
public int PersonId{get;set;}
public string FisrtName{get; set;}
...
public int AddressId{get;set;}
public virtual Address Address{get;set;}
}
class Address
{
public int AddressId{get;set}
public string Street{get;set;}
...
}

1 対 1 の関係であると想定し、EF v4 のすべての規則に従いました。しかし、生成された DB の DB ダイアグラムを作成すると、Person と Address の間の関係が表示されません。つまり、Person のキーと Address のキーとの関係のない 2 つのテーブルが表示されるということです。このような関係を持つ別のテーブルは、1 対多を作成します。アカウントのキーとアドレスの無限大を使用しますが、コードは同じです。デザイナーでは1対多の関係のみが表示され、場合によっては、必要なテーブル間の関係が表示されます。助けてください!助けてくれてありがとう PSテーブルを追加するときにデザイナーに問題があると思いました

4

2 に答える 2

4

最初にコードを使用している場合は、流暢なコードAPIを使用するか、属性を使用してモデルを改良することにより、永続性マッピングをカスタマイズできます。Idなどの単純なキー名を使用する場合、EFは推論を通じて関係を解決できます。あなたの場合、EFはPersonIDとAddressIDがキーであるというヒントを必要とします。

属性アプローチを使用するには、プロジェクトにSystem.ComponentModel.DataAnnotationsへの参照を追加し、対応する'usingSystem.ComponentModel.DataAnnotations;'を追加します。必要に応じてソースファイルに追加します。次のサンプル(EF 4.3.1)は、生成されたAddressesテーブルとPersonsテーブルの間に「1対多」の関係を生成します(この場合、1対1は必要ありません)。コードを実行すると、SQLServerデータベースダイアグラムウィンドウに関係が表示されます。

class Program
{
    static void Main(string[] args)
    {
        using (ContactsEntities entities = new ContactsEntities())
        {
            Address doeaddress = new Address() { Street = "1 Broadway", ZipCode = "01234" };
            Address doeaddress2 = new Address() { Street = "2 Broadway", ZipCode = "01234" };
            entities.Addresses.Add(doeaddress);
            entities.Persons.Add(new Person() { FirstName = "Jane", LastName = "Doe", Address = doeaddress });
            entities.Persons.Add(new Person() { FirstName = "John", LastName = "Doe", Address = doeaddress });
            entities.Persons.Add(new Person() { FirstName = "Jim", LastName = "Doe", Address = doeaddress2 });
            entities.SaveChanges(); 
        }
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();

    }
}

[Table("Addresses")]
public partial class Address
{
    public Address()
    {
        this.Persons = new HashSet<Person>();
    }
    [Key]
    public int AddressID { get; set; }
    [Required]
    public string Street { get; set; }
    [RegularExpression(@"^(\d{5}-\d{4}|\d{5}|\d{9})$")]
    [Required]
    public string ZipCode { get; set; }

    public virtual ICollection<Person> Persons { get; set; }
}

[Table("Persons")]
public partial class Person
{
    [Key]
    public int PersonID { get; set; }
    public int AddressID { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [ForeignKey("AddressID")]
    public virtual Address Address { get; set; }
}

public partial class ContactsEntities : DbContext
{
    public DbSet<Address> Addresses { get; set; }
    public DbSet<Person> Persons { get; set; }
}
于 2012-05-12T21:29:56.650 に答える
0

フィードバックに基づいて、1 対 1 (実際には 1 対 0 または 1) の関係の例を次に示します。流暢な API を使用して、OnModelCreating オーバーライドでリレーションシップを設定しました。このシナリオでは、人は最大で 1 つの写真行を持つことができます。実際には、Photos テーブルに画像データを保持するための 1 つ以上の大きなバイト配列が含まれている場合、これが役立つ場合があります。わかりやすくするために、画像へのリンクを表す文字列を使用しています。

    static void Main(string[] args)
    {
        using (ContactsEntities entities = new ContactsEntities())
        {

            entities.Persons.Add(new Person() { FirstName = "Jane", LastName = "Doe", Photo = new Photo() { PhotoLink = "/images/jane.jpg" } });
            entities.Persons.Add(new Person() { FirstName = "John", LastName = "Doe" }); // no photo
            entities.Persons.Add(new Person() { FirstName = "Joe", LastName = "Smith", Photo = new Photo() { PhotoLink = "/images/joe.jpg", ThumnbnailLink = "/images/thumbs/joe.jpg" } });

            // note that the following is not allowed based on the defined RI rules - will fail on call to SaveChanges:
            // entities.Photos.Add(new Photo() { PhotoLink = "/images/as.jpg" });

            entities.SaveChanges();

            foreach (Person person in entities.Persons)
            {
                Console.WriteLine("{0} {1} {2}", person.FirstName, person.LastName, person.Photo == null ? "missing photo" : person.Photo.PhotoLink);
            } 
        }

        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();

    }
}

public partial class ContactsEntities : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // a Person may have at most one Photo
        modelBuilder.Entity<Person>().HasOptional<Photo>(p => p.Photo);
        // a Photo is dependant on a Person (non-nullable FK constraint)
        modelBuilder.Entity<Photo>().HasRequired<Person>(p => p.Person);
        base.OnModelCreating(modelBuilder);
    }
    public DbSet<Photo> Photos { get; set; }
    public DbSet<Person> Persons { get; set; }
}

[Table("Photos")]
public partial class Photo
{
    [Key]
    public int PhotoID { get; set; }
    [Required]
    public string PhotoLink { get; set; }
    public string ThumnbnailLink { get; set; }
    public virtual Person Person { get; set; }
}

[Table("Persons")]
public partial class Person
{
    [Key]
    public int PersonID { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

    public virtual Photo Photo { get; set; }
}
于 2012-05-13T15:22:31.120 に答える