![](/img/trans.png)
[英]Why is EF4.1 CodeFirst is creating a database even without a `Database.SetInitializer<>()` call?
[英]CodeFirst EF4.1 MVC Against legacy database - Multiplicity conflicts
无论我把它混合在一起,都会给我带来错误。 我有一种感觉,我错过了一些明显的东西,因为我不断收到这些错误。
在模型生成期间检测到一个或多个验证错误:
System.Data.Edm.EdmAssociationType :: Multiplicity与关系'Venue_Courses'中Role'Venue_Courses_Source'中的引用约束冲突。 由于“从属角色”中的所有属性都是不可为空的,因此“主体角色”的多重性必须为“1”。
System.Data.Edm.EdmAssociationEnd :: Multiplicity在关系'Venue_Courses'中的角色'Venue_Courses_Target'中无效。 由于“从属角色”是指关键属性,因此从属角色的多重性的上限必须为1。
一个课程只能有一个场地,许多课程都可以使用场地
public class Course
{
[Key]
public virtual int Id { get; set; }
public string Title { get; set; }
public DateTime StartDate { get; set; }
public int VenueId { get; set; }
public virtual Venue Venue { get; set; }
}
public class Venue
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
#region Courses
//Table Alias
modelBuilder.Entity<Course>().ToTable("DBSCHEMA.TR_COURSES");
//Keys
modelBuilder.Entity<Course>().HasKey(c => c.Id);
//Joins
//Join to Venues
modelBuilder.Entity<Course>().HasOptional(c => c.Venue);
//Fields
modelBuilder.Entity<Course>().Property(c => c.Id).HasColumnName("COURSE_ID");
modelBuilder.Entity<Course>().Property(c => c.Title).HasColumnName("CR_TITLE");
modelBuilder.Entity<Course>().Property(c => c.StartDate).HasColumnName("START_DATE");
modelBuilder.Entity<Course>().Property(c => c.VenueId).HasColumnName("VENUE_ID");
#endregion
#region Venues
//Table Alias
modelBuilder.Entity<Venue>().ToTable("DBSCHEMA.VENUES");
//Keys
modelBuilder.Entity<Venue>().HasKey(v => v.Id);
//Joins
modelBuilder.Entity<Venue>().HasMany(venue => venue.Courses);
//Fields
modelBuilder.Entity<Venue>().Property(v => v.Id).HasColumnName("VENUE_ID");
modelBuilder.Entity<Venue>().Property(v => v.Name).HasColumnName("VENUE_NAME");
#endregion
}
希望这仍然准时帮助你。 我也遇到了完全相同的问题,并且几乎一个小时都在烦恼,直到我发现了我的错误。
问题是Course.Venue
关系是可选的(如在流畅的API上声明的Course.VenueId
),但Course.VenueId
的Id声明是必需的,因此您可以通过将VenueId更改为可选来使VenueId成为可选
public int? VenueId { get; set;}
或者在Fluent API上将关系更改为必需,并且一旦更改了OnModelCreating就应该运行正常。
在网上搜索之后
System.Data.Edm.EdmAssociationType ::多重性与Role中的引用约束冲突
它一直在关注这篇文章,所以这是我的问题和解决方案:
我使用vs ef逆向工程扩展将一个大型项目从ef4.0升级到ef4.1。 我们的mvc应用程序使用metadatatype和partials来装饰ef4.0对象。
删除元数据类型的文件后,项目开始工作。
根问题是[Required]属性,因为ef poco对象可以为nullable,而我的metadatatype在同一属性上有[Required]。 以前是强制执行mvc验证规则,现在ef4.1用于填充导航属性。 删除[required] off metadatatype修复了问题。
public partial class AgentAgency
{
public long OID { get; set; }
public long? AgentOID { get; set; }
public long? AgencyOID { get; set; }
public string ReinsuranceYear { get; set; }
public virtual Agency Agency { get; set; }
public virtual Agent Agent { get; set; }
}
public class AgentAgencyMetadata
{
public Int64 OID { get; set; }
[Required]
public Int64 AgentOID { get; set; }
[Required]
public Int64 AgencyOID { get; set; }
}
我在实体框架项目中遇到了这个错误,我通过改变VenueId的可空值来解决问题。
确保在映射中不要将HasKey()与HasOptional()结合使用。 这导致了我的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.