0

データベースで表現したい共有タイプがあります。最初にコードで可能かどうか、またはそれが悪い設計であるかどうかを知る必要があります。(あなたの推論の情報源を指摘してください)。

レイアウトは次のとおりです。

public class A
{
    public Guid Id;
    public Guid ParentId; // Points to either B or C
    public string Foo;
}

public class B
{
    public Guid Id;
    public virtual ICollection<A> ManyA { get; set; }
    // Other fields
}

public class C
{
    public Guid Id;
    public virtual ICollection<A> ManyA { get; set; }
    // Other fields
}

アノテーションを使用してGUIDPKを管理しました[DatabaseGenerated(DatabaseGeneratedOption.Identity)]。これにより、これが可能になると思います。

目標は、テーブルをAシンプルに保つことです。不要だと思うので、列B_Idを持たないようにしたいと思います。将来的には、とのようなものがたくさんあるタイプがあるかもしれません。また、このシナリオは他のいくつかの関係に使用されます。C_IdDABC

問題の精神は明らかだと思いますが、EF固有のクラスメンバーは説明のためにそこにいます。彼らが変更する必要がある場合は、そうしてください。

(不自然な例については申し訳ありませんが、これの本質であるIMOを公開しても、問題は明確になりません)。

また、何時間も探してみました!適切な答えを見つけるための適切な命名法がわかりません。私はデータベースとEF全般にかなり慣れていません。

4

2 に答える 2

0

Bと型の両方に共通の基本型を作成できることがわかりましたC。例えば:

class Program
{
    static void Main(string[] args)
    {
        using (var context = new Ctx())
        {
            var b = new B();
            var c = new C();
            b.ManyA.Add(new A());
            c.ManyA.Add(new A());

            context.Cs.Add(c);
            context.Bs.Add(b);

            context.SaveChanges();
        }
    }
}

public class Ctx : DbContext
{
    public DbSet<A> As { get; set; }
    public DbSet<B> Bs { get; set; }
    public DbSet<C> Cs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BaseClass>()
            .HasMany<A>(b => b.ManyA)
            .WithRequired(a => a.BaseObject)
            .WillCascadeOnDelete(true);
    }
}

public class BaseClass
{
    public BaseClass() { ManyA = new HashSet<A>(); }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public virtual ICollection<A> ManyA { get; set; }
}

public class A
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public BaseClass BaseObject { get; set; }
    public string Foo { get; set; }
}

public class B : BaseClass
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string SomeProperty { get; set; }
}

public class C : BaseClass
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public int SomeOtherProperty { get; set; }
}

そして、この Msdn articleに基づいて、Table Per Hierarchy データベース レイアウトになります。TPH は TPT よりもパフォーマンスが高く、これが答えになると考えていました。

もっとシンプルなものを本当に望んでいましたが、結局のところ、パフォーマンスが肝心です

于 2013-02-16T20:03:33.707 に答える
0

Guid を使用してインデックスを作成しないでください。なぜ困難な方法を選択するのですか? :S

例のように DataAnnotations を使用します。

クラス:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;

namespace app.Models
{
    [Table("A")]
    public class A
    {

        [Key]
        public int AId { get; set; }

        [Required(ErrorMessage = "Campo obrigatório")]
        [DisplayName("Title")]
        [StringLength(100)]
        public string Title { get; set; }
        public virtual ICollection<B> bCollection { get; set; } 
    }
}

Bクラス:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;

namespace app.Models
{
    [Table("B")]
    public class B
    {
        [ScaffoldColumn(false)]
        [Key]
        public int BId { get; set; }

        [DisplayName("Description")]
        [StringLength(100)]
        public string Description { get; set; }

        public virtual ICollection<A> AList{ get; set; } 
    }
}

ここで詳細を確認できます:リンク!!! EF5 データ注釈の詳細については、リンクを参照してください。

于 2013-02-16T17:44:39.553 に答える