C# EF6使用相同的列名将多个映射到多个

C# EF6使用相同的列名将多个映射到多个,c#,entity-framework,entity-framework-6,mapping,C#,Entity Framework,Entity Framework 6,Mapping,在现有的sqlite数据库中,我有3个表。 首先是一个带有“events”的表,它使用“id”和“license\u key”的复合主键。 第二个表包含'code',它也使用'session\u code'和'license\u key'的组合键。 最后一个表是来自以下sql的关联表: 创建表“事件\代码”( `事件_id`整数不为空, `会话代码`文本不为空, `许可证密钥`文本不为空, 约束'event_code$event_id_session_code_license_key_PK'主键

在现有的sqlite数据库中,我有3个表。
首先是一个带有“events”的表,它使用“id”和“license\u key”的复合主键。
第二个表包含'code',它也使用'session\u code'和'license\u key'的组合键。
最后一个表是来自以下sql的关联表:

创建表“事件\代码”(
`事件_id`整数不为空,
`会话代码`文本不为空,
`许可证密钥`文本不为空,
约束'event_code$event_id_session_code_license_key_PK'主键(`event_id`ASC,`session_code`ASC,`license_key`ASC),
约束'event_code$event_id_license_key_FK'外键('event_id','license_key')在更新级联上引用'event'('id','license_key'),在删除级联上引用'event',
约束'event_code$session_code_license_key_FK'外键('session_code','license_key')在删除级联的更新级联上引用'code'('session_code','license_key')
);
我的程序使用实体框架和fluent映射来加载和存储这些表中的对象。
在EF6中,我认为映射的相关部分应该如下所示:

public class EventCode
{
    public int event_id { get; set; }
    public int session_code { get; set; }
    public int license_key { get; set; }
    public Event Event { get; set; }
    public Code Code { get; set; }
}
public ICollection<EventCode> EventCodes { get; set; }
modelBuilder.Entity<EventCode>()
    .ToTable("event_code");
modelBuilder.Entity<EventCode>()
    .HasKey(e => new { e.event_id, e.session_code, e.license_key });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Event)
    .WithMany(e => e.EventCodes)
    .HasForeignKey(e => new { e.event_id, e.license_key });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Code)
    .WithMany()
    .HasForeignKey(e => new { e.session_code, e.license_key });
modelBuilder.Entity().HasMany(eventInfo=>eventInfo.InternalSessionCodes).WithMany().Map(mapping=>
{
mapping.ToTable(“事件代码”);
mapping.MapLeftKey(“事件id”、“许可证密钥”);
mapping.MapRightKey(“会话代码”、“许可证密钥”);
});
但是,这会引发一个异常:

System.Data.Entity.ModelConfiguration.ModelValidationException:在模型生成过程中检测到一个或多个验证错误:
许可证密钥:名称:类型中的每个属性名称必须是唯一的。已定义属性名称“许可证密钥”。
似乎我不能重复使用同一列。
当然,我可以更改数据库设计,并将这两个实体的许可证密钥存储在各自单独的列中,但因为每个许可证密钥的值始终必须与另一个匹配,这似乎不是特别有用


是否有任何方法可以在不必更改数据库设计的情况下正确设置此映射?

这似乎是EF6通过隐式联接表对多对多映射的一个限制

可以在不更改数据库结构的情况下映射关系,但可以通过添加显式连接实体和映射多对多或多对一来更改实体模型

所以您需要这样一个实体:

public class EventCode
{
    public int event_id { get; set; }
    public int session_code { get; set; }
    public int license_key { get; set; }
    public Event Event { get; set; }
    public Code Code { get; set; }
}
public ICollection<EventCode> EventCodes { get; set; }
modelBuilder.Entity<EventCode>()
    .ToTable("event_code");
modelBuilder.Entity<EventCode>()
    .HasKey(e => new { e.event_id, e.session_code, e.license_key });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Event)
    .WithMany(e => e.EventCodes)
    .HasForeignKey(e => new { e.event_id, e.license_key });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Code)
    .WithMany()
    .HasForeignKey(e => new { e.session_code, e.license_key });
然后将现有集合导航属性更改为以下内容:

public class EventCode
{
    public int event_id { get; set; }
    public int session_code { get; set; }
    public int license_key { get; set; }
    public Event Event { get; set; }
    public Code Code { get; set; }
}
public ICollection<EventCode> EventCodes { get; set; }
modelBuilder.Entity<EventCode>()
    .ToTable("event_code");
modelBuilder.Entity<EventCode>()
    .HasKey(e => new { e.event_id, e.session_code, e.license_key });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Event)
    .WithMany(e => e.EventCodes)
    .HasForeignKey(e => new { e.event_id, e.license_key });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Code)
    .WithMany()
    .HasForeignKey(e => new { e.session_code, e.license_key });
并将它们映射到现有的表列名

但这并不能从根本上改变关系映射解决方案

modelBuilder.Entity<EventCode>()
    .ToTable("Event_Code");
modelBuilder.Entity<EventCode>()
    .HasKey(e => new { e.EventId, e.SessionCode, e.LicenseKey });
modelBuilder.Entity<EventCode>().Property(e => e.EventId)
    .HasColumnName("event_id");
modelBuilder.Entity<EventCode>().Property(e => e.SessionCode)
    .HasColumnName("session_code");
modelBuilder.Entity<EventCode>().Property(e => e.LicenseKey)
    .HasColumnName("license_key");
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Event)
    .WithMany(e => e.EventCodes)
    .HasForeignKey(e => new { e.EventId, e.LicenseKey });
modelBuilder.Entity<EventCode>()
    .HasRequired(e => e.Code)
    .WithMany()
    .HasForeignKey(e => new { e.SessionCode, e.LicenseKey });
modelBuilder.Entity()
.ToTable(“事件代码”);
modelBuilder.Entity()
.HasKey(e=>new{e.EventId,e.SessionCode,e.LicenseKey});
modelBuilder.Entity().Property(e=>e.EventId)
.HasColumnName(“事件id”);
modelBuilder.Entity().Property(e=>e.SessionCode)
.HasColumnName(“会话代码”);
modelBuilder.Entity().Property(e=>e.LicenseKey)
.HasColumnName(“许可证密钥”);
modelBuilder.Entity()
.HasRequired(e=>e.Event)
.WithMany(e=>e.EventCodes)
.HasForeignKey(e=>new{e.EventId,e.LicenseKey});
modelBuilder.Entity()
.HasRequired(e=>e.Code)
.有很多
.HasForeignKey(e=>new{e.SessionCode,e.LicenseKey});
多对多映射的两种方法都有其优缺点,但在这里根本没有选择