2012-10-16 3 views
1

Je travaille sur le portage d'une partie d'une application Ruby on Rails existante vers .NET MVC 4 et Entity Framework 5 (ne demandez pas), et j'ai besoin d'aide pour répliquer certaines fonctionnalités ORM , en particulier les associations polymorphes de Rails.Equivalent aux associations polymorphes de Rails dans Entity Framework

Je préférerais ne pas modifier les instructions de base de données existantes. Je vais vous donner un exemple de ce que je fais - voici ce que la base de données ressemble:

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] 
); 

Le modèle est associé à des marquages ​​plusieurs autres, comme histoire, actifs, etc. enregistrements dans cette apparence de table comme:

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

Ainsi, les deux modèles actifs et histoire dans le domaine ont un à plusieurs avec des marquages. Je voudrais modéliser (Fluent API) cette relation sur mes classes C# Story et Asset.

Existe-t-il un moyen de spécifier ceci, peut-être avec une condition supplémentaire (Tagging.taggable_type = 'Story') lors de la définition de la relation? Je n'ai pas besoin de naviguer dans l'autre direction (de Tagging à Story/Asset).

+0

Documentation pertinente: [Rails Guides] (http://guides.rubyonrails.org/association_basics.html#polymorphic-associations) – Pete

Répondre

2

Faire EF agit comme ActiveRecord ça ne va pas fonctionner, mais vous pouvez faire quelque chose de similaire. Vous avez une classe Taggable qui agit comme la classe polymorphe et cette classe a et appartient à beaucoup de Tags, vos autres classes héritent de Taggable qui les rend "Taggable" donc par exemple Article: Taggable donc dans l'objet vous aurez quelque chose comme

article.Tags -> parce que l'article est Taggable et un Taggable a plusieurs Tags.

Voici le code testé et fonctionnel

`

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; } 
} 

`

afin que vous puissiez faire des choses comme ça

`

 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(); 

`

J'espère avoir résolu votre question.

Questions connexes