我正在使用Entity Framework和Code First来创建数据库等等。
public class Company : Entity // Entity contains an ID and a RowVersion
{
// some Properties
//
public virtual ICollection<Profile> Profiles { get; set; }
}
// No Attributes here, because this Model has to be reusable
public class Profile : Entity
{
// some Properties
//
public virtual ICollection<Company> Companies { get; set; }
}
我正在尝试要求公司拥有管理该公司的个人资料(cn:n)。我有一些“业务逻辑”负责编辑实体,主要是因为验证部分。该逻辑将验证是否仍然设置了所需的关系。我在这里有两个问题:
DB是否应该选择关系(编辑方便)? “业务逻辑”必须是唯一编辑数据库的人。
或者我如何设置所需的关系?
在我看来,如果你走的话,我不介意,在互联网上关于EF与很多关系的关系太少了。 (我是新来的,所以不要紧,如果这违反了一些规则)
修改 我知道第3桌的方式,但这是我的观点:How to require many to many relation with code first
答案 0 :(得分:3)
在出现这种情况时(多对多)设计数据库时,请使用附加表来区分这一方面。例如,我们有两个表t1和t2,t1多到多个到t2,创建一个相关的表t3: t1一对多到t3和t2一对多t3。
在您的情况下,您需要创建一个额外的类,如下所示:
public class CompanyProfile {
public virtual ICollection<Company> Companies { get; set; }
public virtual ICollection<Profile> Profiles { get; set; }
}
在您的classees公司和个人资料中创建指向CompanyProfile类的链接。
答案 1 :(得分:2)
您需要通过实现IValidatableObject
接口将您的实体转换为可验证的对象,其方法将检查您在集合中始终至少有一个项目。当您致电SaveChanges()
public class Company : Entity, IValidatableObject
{
public virtual ICollection<Profile> Profiles { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!Profiles.Any())
yield return new ValidationResult("Company must have at least 1 Profile");
}
}
public class Profile : Entity, IValidatableObject
{
public virtual ICollection<Company> Companies { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!Companies.Any())
yield return new ValidationResult("Profile must have at least 1 Company");
}
}