複数のモデル (タスク/サーバー/など) があり、これらのモデルはすべてコメントをサポートする必要があります。これらすべてのモデルが参照できる集中型のコメント テーブルが必要です (ただし、他の設計も可能です)。
コメント テーブルには次のフィールドがあります。
CommentID
RefTable
RefId
Text
たとえば、タスク クラスで次のコードを使用して、タスクのコメントを参照できます。
IEnumerable<Comment> comments = Comment.Find(this.GetType().Name, this.TaskID)
ただし、次のコードを使用できるように、タスクからコメントへの HasMany マッピングを作成することをお勧めします。
this.Comments
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.ModelConfiguration;
namespace Models.Mapping
{
public class TaskMap : EntityTypeConfiguration<Task>
{
public TaskManagerItemMap()
{
// Primary Key
this.HasKey(t => t.TaskID);
...
this.Property(t => t.TaskID).HasColumnName("TaskID")
...
this.ToTable("Task");
}
}
}
using System;
using System.Collections.Generic;
namespace Models
{
public partial class Task
{
public int TaskID { get; set; }
....
public virtual IEnumerable<Comment> Comments { get; set; }
...
}
}
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.ModelConfiguration;
namespace Models.Mapping
{
public class CommentMap : EntityTypeConfiguration<Comment>
{
public CommentMap()
{
this.HasKey(t => new { t.RefID, t.RefTable });
this.ToTable("Comment");
this.Property(t => t.CommentID).HasColumnName("CommentID")
.IsRequired();
this.Property(t => t.RefID).HasColumnName("RefID")
.IsRequired();
this.Property(t => t.RefTable).HasColumnName("RefTable")
.IsRequired();
this.Property(t => t.Text).HasColumnName("Text")
.IsRequired();
}
}
}
using System;
using System.Collections.Generic;
namespace Models
{
public partial class Comment
{
public int CommentID { get; set; }
public int RefID { get; set; }
public string RefTable { get; set; }
public string Text { get; set; }
}
}
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Globalization;
using Vocus50.SiteManager.SiteManager2014.Models.Mapping;
namespace Models
{
public partial class DataContext : DbContext
{
static DataContext()
{
Database.SetInitializer<DataContext>(null);
}
public DataContext()
: base("Name=DataContext")
{
}
public DbSet<Task> Task{ get; set; }
public DbSet<Comment> Comment { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new TaskMap());
modelBuilder.Configurations.Add(new CommentMap());
}
}
}