如何首先要求与代码有多对多的关系

时间:2015-03-13 14:08:10

标签: c# entity-framework

我正在使用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

2 个答案:

答案 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()

时,EF会调用此方法
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"); 
    }
}

参考:IValidateableObject example