2010-09-22 28 views
6

Tôi có thiết lập sau (hoạt động tốt). Sử dụng CodeFirst (CTP4).Nhiều mối quan hệ mà không có bảng nối đôi, khung thực thể

Mẫu có danh sách các ảnh hưởng, mỗi ảnh hưởng đều mang lại giá trị cho một đặc điểm.

public class Template 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<Influence> Influences { get; set; } 
} 

public class Influence 
{ 
    public virtual int Id { get; set; } 
    public virtual Trait Trait { get; set; } 
    public virtual int Value { get; set; } 
} 

public class Trait 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

Mẫu được định cấu hình như thế này.

public class TemplateConfiguration : EntityConfiguration<Template> 
{ 
    public TemplateConfiguration() 
    { 
     HasKey(o => o.Id); 
     Property(o => o.Id).IsIdentity(); 

     HasMany(o => o.Influences).WithRequired() 
      .Map("templates.influences", 
      (template, influence) => new { 
       Template = template.Id, 
       Influence = influence.Id 
      }); 
     MapSingleType(o => new { 
      o.Id 
     }); 
    } 
} 

này hoạt động nhưng tôi thà tránh thêm bảng 'ảnh hưởng'. Về cơ bản, 'Ảnh hưởng' chỉ đơn giản là một đối tượng và không cần phải là một cửa hàng trung tâm cho họ. Trong thực tế, nó có lợi hơn cho thiết kế mà tôi đang cố gắng tiếp cận nếu không có một bảng trung tâm cho chúng.

Tôi muốn thiết lập kịch bản như thế này cho bảng Mẫu ... Về cơ bản Ảnh hưởng không có bảng riêng, chúng chỉ được ánh xạ bằng Trait/Value nơi chúng được sử dụng.

public TemplateConfiguration() 
    { 
     HasMany(u => u.Influences).WithMany() 
      .Map("templates.influences", 
      (template, influence) => new { 
       Template = template.Id, 
       Trait = influence.Trait.Id, 
       Value = influence.Value 
      }); 

     MapSingleType(c => new { 
      c.Id 
     }).ToTable("templates"); 
    } 

Khi tôi cố gắng thực hiện theo cách này, tôi có ngoại lệ trên Bản đồ mẫu.

System.InvalidOperationException là unhandled

Các biểu thức đã cho bao gồm một mô hình không được công nhận 'influence.Trait.Id'.


Dưới đây là toàn bộ mã dự án, nếu cần thiết.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Objects; 
using System.Data.EntityClient; 
using System.Data.Entity.ModelConfiguration; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

namespace EFTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
        Database.SetInitializer<SampleDataContext>(new AlwaysRecreateDatabase<SampleDataContext>()); 
      var builder = new ModelBuilder(); 

      builder.Configurations.Add(new TraitConfiguration()); 
      builder.Configurations.Add(new InfluenceConfiguration()); 
      builder.Configurations.Add(new TemplateConfiguration()); 

      var model = builder.CreateModel(); 

      using (var context = new SampleDataContext(model)) 
      { 
       var traits = new List<Trait> 
       { 
        new Trait { Name = "Years" }, 
        new Trait { Name = "Days" } 
       }; 
       traits.ForEach(x => { context.Traits.Add(x); }); 
       context.SaveChanges(); 

       var templates = new List<Template> 
       { 
        new Template 
        { 
         Influences = new List<Influence> 
         { 
          new Influence 
          { 
           Trait = context.Traits.Single(i => i.Name == "Years"), 
           Value = 5 
          }, 
          new Influence 
          { 
           Trait = context.Traits.Single(i => i.Name == "Days"), 
           Value = 15 
          } 
         } 
        } 
       }; 
       templates.ForEach(x => { context.Templates.Add(x); }); 
       context.SaveChanges(); 
      } 
     } 
    } 

    public class SampleDataContext : DbContext 
    { 
     public SampleDataContext(DbModel model) 
      : base(model) 
     { 
     } 

     public DbSet<Trait> Traits { get; set; } 
     public DbSet<Influence> Influences { get; set; } 
     public DbSet<Template> Templates { get; set; } 
    } 

    public class Trait 
    { 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
    } 

    public class TraitConfiguration : EntityConfiguration<Trait> 
    { 
     public TraitConfiguration() 
     { 
      HasKey(o => o.Id); 
      Property(o => o.Id).IsIdentity(); 

      MapSingleType(o => new { 
       o.Id, 
       o.Name 
      }); 
     } 
    } 

    public class Influence 
    { 
     public virtual int Id { get; set; } 
     public virtual Trait Trait { get; set; } 
     public virtual int Value { get; set; } 
    } 

    public class InfluenceConfiguration : EntityConfiguration<Influence> 
    { 
     public InfluenceConfiguration() 
     { 
      HasKey(o => o.Id); 
      Property(o => o.Id).IsIdentity(); 

      HasRequired(o => o.Trait); 
      Property(o => o.Value); 

      MapSingleType(o => new { 
       o.Id, 
       Trait = o.Trait.Id, 
       o.Value 
      }); 
     } 
    } 

    public class Template 
    { 
     public virtual int Id { get; set; } 
     public virtual ICollection<Influence> Influences { get; set; } 
    } 

    public class TemplateConfiguration : EntityConfiguration<Template> 
    { 
     public TemplateConfiguration() 
     { 
      HasKey(o => o.Id); 
      Property(o => o.Id).IsIdentity(); 

      HasMany(o => o.Influences).WithRequired() 
       .Map("templates.influences", 
       (template, influence) => new { 
        Template = template.Id, 
        Influence = influence.Id 
       }); 
      MapSingleType(o => new { 
       o.Id 
      }); 
     } 
    } 
} 
+0

Bất cứ ai? Xin vui lòng? Điều này thực sự là lái xe cho tôi hạt. – Ciel

+1

Bạn sẽ nhận được nhiều phản hồi hơn nếu bạn đăng một đoạn mã cực kỳ ngắn và đơn giản để ghi lại sự cố ở dạng tối thiểu của nó thay vì số lượng lớn mã bạn hiện có. Ngoài ra, khi bạn nói "nó cho tôi lỗi", bạn _must_ bao gồm toàn bộ lỗi/văn bản ngoại lệ, nếu không nó tương đương với câu nói "nó không hoạt động". –

+2

Thông thường, khi tôi chỉ đăng những gì cần thiết, tôi nhận được mọi người phàn nàn rằng tôi không cung cấp đủ mã để sử dụng. Vì vậy, lần này tôi chỉ đăng dự án đầy đủ. Tôi đã chỉnh sửa nó ngắn gọn hơn và để lại toàn bộ mã ở dưới cùng cho bất kỳ tham chiếu nào cần thiết. – Ciel

Trả lời

1

OK, ý tưởng mới trong ngày mới.

Tôi hiện đã cài đặt CTP4 và nhận được 4 bảng giống như bạn nhận được.

Lý do tại sao mối quan hệ nhiều đến nhiều được tạo ra, là mô hình không biết rằng ảnh hưởng sẽ chỉ được sử dụng bởi một mẫu. Sau đó, bạn phải nói với nó rằng:

public class Influence 
{ 
    public virtual int Id { get; set; } 
    public virtual Trait Trait { get; set; } 
    public virtual int Value { get; set; } 
    public virtual Template Template { get; set; } 
} 

và:

public InfluenceConfiguration() 
    { 
     HasKey(o => o.Id); 
     Property(o => o.Id).IsIdentity(); 
     Property(o => o.Value); 

     MapSingleType(o => new 
     { 
      o.Id, 
      Trait = o.Trait.Id, 
      o.Value, 
      Template = o.Template.Id 
     }); 
    } 

Bảng ảnh hưởng sau đó sẽ trông như thế này:

CREATE TABLE [dbo].[Influences](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Template] [int] NULL, 
    [Trait] [int] NULL, 
    [Value] [int] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Influences] WITH CHECK ADD CONSTRAINT [Influence_Template] FOREIGN KEY([Template]) 
REFERENCES [dbo].[Templates] ([Id]) 
GO 

ALTER TABLE [dbo].[Influences] CHECK CONSTRAINT [Influence_Template] 
GO 

ALTER TABLE [dbo].[Influences] WITH CHECK ADD CONSTRAINT [Influence_Trait] FOREIGN KEY([Trait]) 
REFERENCES [dbo].[Traits] ([Id]) 
GO 

ALTER TABLE [dbo].[Influences] CHECK CONSTRAINT [Influence_Trait] 
GO 
+0

Vậy tôi có thể làm gì với điều đó? Đối tượng ảnh hưởng cần phải tồn tại trong C# như một đối tượng, nhưng không tồn tại trong cơ sở dữ liệu như một thực thể. – Ciel

+1

@Shiraz - Tôi nghĩ bạn đã quay ngược lại. Anh ta muốn Template-> Trait trong cơ sở dữ liệu, và Template-> Influence-> Trait in entitites –

+0

Vâng, tôi nghĩ anh ta hiểu nhầm câu hỏi của tôi. – Ciel

Các vấn đề liên quan