1

既存の Ruby on Rails アプリケーションの一部を .NET MVC 4 および Entity Framework 5 に移植する作業を行っています (聞かないでください)。ORM 機能、特に Rails のポリモーフィック アソシエーションを複製するのに助けが必要です。

既存のデータベース構造を変更したくありません。私が行っていることの例を 1 つ挙げます。データベースは次のようになります。

CREATE TABLE tags (
    id integer PRIMARY KEY,
    name nvarchar(128) NOT NULL,
    UNIQUE (name)
);

CREATE TABLE taggings (
    id integer PRIMARY KEY,
    tag_id integer REFERENCES tags(id) ON DELETE CASCADE,
    taggable_id integer,
    taggable_type nvarchar(255),
);

CREATE TABLE stories (
    id integer PRIMARY KEY,
    name nvarchar(128) NOT NULL
    [more stuff]
);

CREATE TABLE assets (
    id integer PRIMARY KEY,
    name nvarchar(128) NOT NULL
    [more stuff]
);

タグ付けモデルは、ストーリー、アセットなど、他のいくつかに関連付けられています。このテーブルのレコードは次のようになります。

INSERT INTO taggings values (1, 1, 1234, 'Story');
INSERT INTO taggings values (2, 343, 69, 'Asset');
INSERT INTO taggings values (3, 200, 42, 'Asset');

したがって、ドメイン内のアセット モデルとストーリー モデルの両方が、タグ付けと 1 対多の関係にあります。C# の Story クラスと Asset クラスでこの関係をモデル化 (Fluent API) したいと考えています。

関係を定義するときに、おそらく追加の条件 (Tagging.taggable_type = 'Story') を使用して、これを指定する方法はありますか? 他の方向 (タグ付けからストーリー/アセットへ) に移動する必要はありません。

4

1 に答える 1

2

EF を ActiveRecord のように動作させることはできませんが、似たようなことはできます。多態性クラスのように機能するクラス Taggable があり、そのクラスには多くのタグがあり、それらに属しています。他のクラスは Taggable から継承して「タグ付け可能」にするため、たとえば Article : Taggable オブジェクト内に次のようなものがあります

article.Tags -> article は Taggable であり、Taggable には多くのタグがあるためです。

以下は、テスト済みで機能しているコードです

`

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Taggable> Taggables { get; set; }
}

public class Taggable
{
    public int Id { get; set; }
    public List<Tag> Tags { get; set; }
}

[Table("Quests")]
public class Quest : Taggable
{
    public string Name { get; set; }
    public string QuestType { get; set; }
}

[Table("Articles")]
public class Article : Taggable
{
    public string Name { get; set; }
    public string ArticleType { get; set; }
}

public class Repository : DbContext
{
    public Repository() : base("Blog")
    {
    }

    public DbSet<Tag> Tags { get; set; }
    public DbSet<Taggable> Taggables { get; set; }
}

`

だからあなたはこのようなことをすることができます

`

        Repository r = new Repository();
        Article a = new Article();
        a.Tags = r.Tags.ToList();
        a.Name = "article 1";
        r.Taggables.Add(a);

        Quest q = new Quest();
        q.Tags = r.Tags.ToList().Skip(2).ToList();
        r.Taggables.Add(q);

        r.SaveChanges();

        var bb = from ttt in r.Taggables
                 where ttt is Article
                 select ttt;

        var jj = bb.ToList();

`

あなたの質問を解決したことを願っています。

于 2013-01-07T15:24:26.487 に答える