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
});
}
}
}
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
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". –
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