C# 如何首先使用实体框架代码为用户设置语言选择

C# 如何首先使用实体框架代码为用户设置语言选择,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我在现有的Entity Framework code first应用程序中添加了为用户和公司选择语言的功能,但我不太确定如何最好地进行 这是我想要的场景类型的一个示例: 系统中所有可用语言:英语、德语、法语、, 西班牙语、葡萄牙语、意大利语、荷兰语、丹麦语、瑞典语和挪威语 A公司:提供英语、德语和法语,英语为 默认 B公司:提供西班牙语、葡萄牙语、意大利语和英语, 意大利语是默认的 用户X:属于A公司,所以英语、德语和法语是 可用。创建用户时,将英语设置为其选定的 语言(因为它是公司的默认语言)

我在现有的Entity Framework code first应用程序中添加了为用户和公司选择语言的功能,但我不太确定如何最好地进行

这是我想要的场景类型的一个示例:

系统中所有可用语言:英语、德语、法语、, 西班牙语、葡萄牙语、意大利语、荷兰语、丹麦语、瑞典语和挪威语

A公司:提供英语、德语和法语,英语为 默认

B公司:提供西班牙语、葡萄牙语、意大利语和英语, 意大利语是默认的

用户X:属于A公司,所以英语、德语和法语是 可用。创建用户时,将英语设置为其选定的 语言(因为它是公司的默认语言),但是用户 已选择法语作为其选定语言

用户Y:不属于任何公司。英语和法语是 如果可用,则选择英语

我创建了如下实体(为了简洁起见,删除了其他属性):

公共类语言
{
[关键]
公共Guid Id{get;set;}
公共字符串语言代码{get;set;}
公共字符串名称{get;set;}
}
公营公司
{
公共ICollection可用语言{get;set;}
公共语言DefaultLanguage{get;set;}
}
公共类用户
{
公共ICollection可用语言{get;set;}
公共语言SelectedLanguage{get;set;}
}

这给了我一个包含Id、LanguageCode、Name、CompanyId和UserId的语言表,可以将公司和用户映射到语言,但它没有给我存储语言主列表的任何地方。我是否需要创建一个单独的实体才能工作,或者实现这一点的最佳方法是什么?

您的描述表明
语言
公司
之间以及
语言
用户
之间的关系(关于
可用语言
)实际上是多对多的关系:一种语言可以在许多公司中使用,一个公司可以有许多可用的语言——对用户也是如此

为了实现多对多关系,您可以保持模型不变,但可以使用Fluent API添加映射:

modelBuilder.Entity<Company>()
    .HasMany(c => c.AvailableLanguages)
    .WithMany()
    .Map(m =>
    {
        m.ToTable("CompanyLanguages");
        m.MapLeftKey("CompanyId");
        m.MapRightKey("LanguageId");
    });

modelBuilder.Entity<User>()
    .HasMany(u => u.AvailableLanguages)
    .WithMany()
    .Map(m =>
    {
        m.ToTable("UserLanguages");
        m.MapLeftKey("UserId");
        m.MapRightKey("LanguageId");
    });
modelBuilder.Entity()
.HasMany(c=>c.AvailableLanguages)
.有很多
.Map(m=>
{
m、 ToTable(“公司语言”);
m、 MapLeftKey(“公司ID”);
m、 MapRightKey(“LanguageId”);
});
modelBuilder.Entity()
.HasMany(u=>u.AvailableLanguages)
.有很多
.Map(m=>
{
m、 ToTable(“用户语言”);
m、 MapLeftKey(“用户ID”);
m、 MapRightKey(“LanguageId”);
});
这将为您提供五个表,三个实体表和两个多对多关系的附加链接表<代码>语言不再包含任何外键,成为您心目中的主语言表


在你的模型中,我看不出你会如何处理一种额外的语言被添加到公司可用语言列表中的情况。是否要更新该公司所有用户的可用语言?更好的解决方案可能是只给用户一个公司的参考(而不是他自己的可用语言列表),并在需要时从他的公司选择用户的可用语言。用户根本不属于任何公司的情况可以通过定义一个特殊公司“匿名公司”或这些用户所属的公司来解决。

可用语言列表是否会根据用户或公司的不同而变化?或者可用语言只是一个查找表?我需要两者-有一个所有语言的主列表,然后当你创建一个公司/用户时,你选择哪些语言可供他们使用。“DefaultLanguage”和“SelectedLanguage”是“AvailableLanguages”的一部分还是分开的。我用一个例子更新了,希望能让它更清楚!对不起,我的回答迟了,我在读之前离开了周末。这很好用,非常感谢!关于语言更新的观点很好,但是目前他们希望能够覆盖单个用户的语言,因此他们需要自己的语言集。另外,代码中有一个小错误,是m.ToTable而不是m.Table。@IngenSpeciell:啊,对,我已经更正了。谢谢
modelBuilder.Entity<Company>()
    .HasMany(c => c.AvailableLanguages)
    .WithMany()
    .Map(m =>
    {
        m.ToTable("CompanyLanguages");
        m.MapLeftKey("CompanyId");
        m.MapRightKey("LanguageId");
    });

modelBuilder.Entity<User>()
    .HasMany(u => u.AvailableLanguages)
    .WithMany()
    .Map(m =>
    {
        m.ToTable("UserLanguages");
        m.MapLeftKey("UserId");
        m.MapRightKey("LanguageId");
    });