0

複数のモデル (タスク/サーバー/など) があり、これらのモデルはすべてコメントをサポートする必要があります。これらすべてのモデルが参照できる集中型のコメント テーブルが必要です (ただし、他の設計も可能です)。

コメント テーブルには次のフィールドがあります。

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

2 に答える 2

0

上記のコードを使用する場合、問題はRefTable(または上記のRefModel-同じであると思われますか?)を送信することにあるように思われます。ここでの1つのオプション(他にも多くある可能性があります)はオーバーライドすることですSaveChangesを実行し、保存時に値を検査(または入力)します。

したがって、SaveChanges(以下の大まかな方法​​、ネット上には多くのサンプルがあります)をオーバーライドする場合、エンティティタイプに基づいてこのテーブルに入力します。ハッキーな感じがするので、おそらくもっと良い解決策があります

EntityFrameworkにSQLのデフォルト値を使用させる簡単な方法はありますか?

もちろん、これを正しく理解していれば:)

于 2013-02-28T22:34:46.790 に答える
0

Automapperの使用を検討しましたか。お探しの機能にご利用いただけると思います。

于 2013-03-04T16:35:11.540 に答える